C++ 在不同环境中使用char*vs std::string

C++ 在不同环境中使用char*vs std::string,c++,C++,我一直在代码中使用std::string。我将创建一个std::string并通过引用传递它。然而,有人建议使用char*代替。在移植代码时,有关std::string的某些内容不可靠。这是真的吗?我避免使用char*,因为我需要对它进行一些内存管理。相反,我发现使用std::字符串更容易使用 基本上,我有一个10位数的输出,我存储在这个字符串中。ATM,我不知道哪个更好用。STD::String是C++标准的一部分,自1998起。它在所有当前的C++编译器中都可用。真的没有理由不使用它。如果有

我一直在代码中使用std::string。我将创建一个std::string并通过引用传递它。然而,有人建议使用char*代替。在移植代码时,有关std::string的某些内容不可靠。这是真的吗?我避免使用char*,因为我需要对它进行一些内存管理。相反,我发现使用std::字符串更容易使用


基本上,我有一个10位数的输出,我存储在这个字符串中。ATM,我不知道哪个更好用。

STD::String是C++标准的一部分,自1998起。它在所有当前的C++编译器中都可用。真的没有理由不使用它。如果有需要使用C样式字符串的API,可以使用std::string的C_str成员从字符串中获取一个:

std::string s = "foo";
int n = strlen( s.c_str() );   

STD::String是C++标准的一部分,自1998以来一直是。它在所有当前的C++编译器中都可用。真的没有理由不使用它。如果有需要使用C样式字符串的API,可以使用std::string的C_str成员从字符串中获取一个:

std::string s = "foo";
int n = strlen( s.c_str() );   
使用char*可以确保不会出现库之间的可移植性问题。 如果库导出的函数使用std::string,则它可能无法与另一个已链接到不同版本标准库的库进行通信。

使用char*可以确保不会在库之间出现可移植性问题。
如果库导出了使用STD::string的函数,则可能会与另一个与标准库不同版本链接的库通信,在C++中,几乎每个字符串都应该是STD::string,除非另一个库需要cstring,在这种情况下,您仍然应该使用std::string并传递string.c_str,除非您使用的是与缓冲区一起工作的函数


但是,如果您正在编写一个库并导出函数,最好使用const char参数而不是STD::string参数来移植。在C++中,几乎每个字符串都应该是STD::string,除非另一个库需要一个cstring,在这种情况下,您仍然应该使用一个STD::string和Prime.cStrr,除非您使用的是与缓冲区一起工作的函数


但是,如果您正在编写库并导出函数,最好使用const char*参数,而不是std::string参数,以实现可移植性。

我认为,除非您打算向第三方提供一些API,否则无需担心


只要使用std::string

我认为没有什么好担心的,除非您打算向第三方提供一些API


只要使用std::string

std::string没有什么不可移植的地方,这也是char*的问题。std::string实际上在内部使用char*。

std::string没有什么不可移植的地方,而char*。string实际上在内部使用char*。

string更好。在任何平台上都没有不可靠的地方。如果担心传递大型类,可以将字符串的常量引用传递到函数中。使编码更快,更不容易出现错误

字符串更好。在任何平台上都没有不可靠的地方。如果担心传递大型类,可以将字符串的常量引用传递到函数中。使编码更快,更不容易出现错误

除了更简单之外,std::string可能更有效。它的小字符串优化可以将10位数字保留在std::string对象本身中,而不是将它们放在堆外的另一个内存块中。

除此之外,std::string可能更有效。它的小字符串优化可以将10位数字保留在std::string对象本身中,而不是将它们放在堆外的另一个内存块中。

如果分配给char*的内容被释放到另一个库中,则char*可能会出现类似的问题。@Neil:这是另一种问题。请注意,我并不鼓励使用char*本身,我只是说这可能是std::string问题的一个可能来源,因为问题是有人建议。。。这是真的吗?@Neil:是的,但是很多API都不会传递内存的所有权-如果你所做的只是在我的char*缓冲区内读写,我不在乎你如何分配内存。然而,如果库不兼容,任何std::string的使用都可能出错。因此,虽然使用char*时可能会出错,但您可以做很多事情。使用std::string,您根本无法跨越库不兼容边界进行调用。所以char*是否更好取决于我是否需要做一些内存管理,问题的意思是,跨越边界

是unix中具有控制台接口的代码。然而,我将为win环境提供一个静态库dll。在这种情况下,我应该使用char*数组吗?我不想再为windows平台做不必要的额外工作了。这意味着,如果我知道,我将不得不删除控制台功能。但是,除了提供API之外,我希望我的代码不易阅读……从你们的话来看,我需要使用char*而不是std::strings。@未知您最初的问题是关于可移植性的,但似乎您应该询问库API设计。这两个问题有些关联,但绝不相同。问一个新问题可能是个好主意。不要编辑这个问题,确切地解释你想做什么,如果你不确定它们的意思,不要使用诸如porting之类的词。如果分配给char*的东西被释放到另一个库中,你可能会遇到类似的char*问题。@Neil:嗯,那是另一种问题。请注意,我并不鼓励使用char*本身,我只是说这可能是std::string问题的一个可能来源,因为问题是有人建议。。。这是真的吗?@Neil:是的,但是很多API都不会传递内存的所有权-如果你所做的只是在我的char*缓冲区内读写,我不在乎你如何分配内存。然而,如果库不兼容,任何std::string的使用都可能出错。因此,虽然使用char*时可能会出错,但您可以做很多事情。使用std::string,您根本无法跨越库不兼容边界进行调用。所以char*是否更好取决于我是否需要跨边界进行内存管理。我目前正在unix中编写这段代码,它有一个控制台界面。然而,我将为win环境提供一个静态库dll。在这种情况下,我应该使用char*数组吗?我不想再为windows平台做不必要的额外工作了。这意味着,如果我知道,我将不得不删除控制台功能。但是,除了提供API之外,我希望我的代码不易阅读……从你们的话来看,我需要使用char*而不是std::strings。@未知您最初的问题是关于可移植性的,但似乎您应该询问库API设计。这两个问题有些关联,但绝不相同。问一个新问题可能是个好主意。不要编辑这个问题,确切地解释你想做什么,如果你不确定它们的含义,不要使用诸如移植之类的词。为了可移植性?在前面的讨论中,人们似乎认为w/e问题会困扰char*对于std::string也是一样的。我不确定我是否明白。另外,您能否详细说明使用缓冲区的含义?我问这个问题的原因是,尽管我在unix上编写这段代码,但它将有一个控制台接口。此版本的windows版本将是一个dll,并且很可能有第三方程序调用的api。无论谁/什么人在使用您的代码,const char*都将是完全相同的。STD::String可能不是,尤其是如果您与C++运行时静态链接的话。如果我使用C++运行时2编译并导出函数虚空FooSistSt::string到静态库中,然后编译并将其传送到使用C++运行时1.8的客户端,该客户端不使用相同的字符串实现,当程序需要std::string时,它们的std::string并不是我的程序所期望的,所以基本上我必须修改代码,删除std::string的所有实例,并将其更改为char*。这就是我所理解的,为了不出现任何问题。你不必这样做,只是让导出的函数采用const char*更便于移植;如果不导出它们,则可以毫无问题地获取std::string。无论哪种方式,我都会在它被传递之后用一个字符来构造一个STD::string,因为C++代码应该总是使用STD::String。在前面的讨论中,人们似乎认为w/e问题会困扰char*对于std::string也是一样的。我不确定我是否明白。另外,您能否详细说明使用缓冲区的含义?我问这个问题的原因是,尽管我在unix上编写这段代码,但它将有一个控制台接口。此版本的windows版本将是一个dll,并且很可能有第三方程序调用的api。无论谁/什么人在使用您的代码,const char*都将是完全相同的。STD::String可能不是,尤其是如果您与C++运行时静态链接的话。如果我使用C++运行时2编译并导出函数虚空FooSistSt::string到静态库,然后编译并将其传送给使用C++运行时1.8的客户端,客户端不使用相同的字符串实现,事情就会被炸毁。
因为它们的std::string不是我的程序想要的std::string,所以基本上我必须修改代码以删除std::string的所有实例并将其更改为char*。这就是我所理解的,为了不出现任何问题。你不必这样做,只是让导出的函数采用const char*更便于移植;如果不导出它们,则可以毫无问题地获取std::string。无论哪种方式,我都在经过了一个char *之后构造了一个带有STAR::String的字符串,因为C++代码应该总是在可能的情况下使用STD::string。