使用文字初始化系统::String^,但不使用字符串::c_str()或char[]
Initialise System::String^ with literal but not string::c_str() or char[]
我最近开始学习.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::string
和char[]
类型只接受"窄"(非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;