使用文字初始化系统::String^,但不使用字符串::c_str()或char[]

Initialise System::String^ with literal but not string::c_str() or char[]

本文关键字:str char 系统 初始化 文字 String 字符串      更新时间:2023-10-16

我最近开始学习.net和Windows API,目前正在编写一个谈论串行端口的类。

为了将一行写入串行端口,我使用WriteLine函数,该函数接受参数System::String^。我想知道是否可以从std::string初始化System::String^

我注意到我可以做以下事情:

serialPort->WriteLine("stuff");

但我做不到:

std::string data = "stuff";
serialPort->WriteLine(data.c_str());

另外,我不能做:

char data[] = "stuff";
serialPort->WriteLine(data);

也不是

char* data = "stuff";
serialPort->WriteLine(data);

有人能告诉我这里发生了什么事吗?当我传入VS时,它是否以某种方式将文本转换为它自己的东西?

最后,我不确定我是否为此选择了正确的标签,因为我真的不知道它属于什么类别。

您总是可以调用具有字符串文字的函数,因为编译器会自动将其转换为适当字符串类型的值。

这里的问题是,您试图将.NET Framework的内容(System::String)与标准C++字符串类型(std::string)混合使用,但它们根本无法很好地混合使用。接受System::String类型参数的.NET函数是而不是编写或重载以接受std::string类型参数。如果使用的是.NET Framework,那么您使用的是C++/CLI,并且通常需要使用.NET字符串类型,而不是C++字符串类型。

类似地,标准C++函数需要std::string,而对.NET Framework字符串类型一无所知。因此,如果您希望调用C++标准库中的函数,则应该使用它的字符串类型。

C样式字符串(char[])是旧的后备方法,在编写C++代码时您并不想使用它。std::string总是一个更好的选项,它甚至提供了c_str()方法,您已经知道在调用需要char数组的API函数时要使用该方法。但和其他两种字符串类型一样,这一种也不能互换。

您将遇到的一个特别大的问题是,std::stringchar[]类型只接受"窄"(非Unicode)字符串,而.NET Framework System::String类型只适用于宽(Unicode)字符串。当涉及到转换时,这又给组合带来了麻烦。它不可能像演员阵容那样简单。

但这并不意味着不可能在类型之间转换。MSDN上有一个有用的文档,解释了如何在各种C++字符串类型之间进行转换。

总之,您可以使用接受char*:的适当重载构造函数将C样式字符串转换为System::String

const char* cString = "Hello, World!";
System::String ^netString = gcnew System::String(cString);
Console::WriteLine(netString);
delete netString;

然后,当然,您可以将上述方法与c_str()方法相结合,将从std::string转换为System::String

std::string stdString("Hello, World!");
System::String ^netString = gcnew System::String(stdString.c_str());
Console::WriteLine(netString);
delete netString;