我最近开始学习.net和Windows API,而我正在写一个讲串口的课程。
为了在串口写入一行,我使用带有参数WriteLine
的{{1}}函数。我想知道是否可以从System::String^
初始化System::String^
。
我注意到我可以执行以下操作:
std::string
但我不能这样做:
serialPort->WriteLine("stuff");
另外,我不能这样做:
std::string data = "stuff";
serialPort->WriteLine(data.c_str());
,也不
char data[] = "stuff";
serialPort->WriteLine(data);
有人能让我知道这里发生了什么吗?当我传入文件时,VS以某种方式将文字转换为它自己的东西吗?
最后,我不确定我是否为此选择了正确的标签,因为我真的不知道这是什么。
答案 0 :(得分:3)
您始终可以使用字符串文字调用函数,因为编译器会自动将其转换为相应字符串类型的值。
这里的问题是你试图将.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
总是更好的选择,它甚至提供了在调用需要char数组的API函数时已经知道的c_str()
方法。但是和其他两种字符串类型一样,这个字符串也不是可互换的。
您将遇到的一个特别大的问题是std::string
和char[]
类型只接受“narrow”(非Unicode)字符串,而.NET Framework System::String
类型仅适用于宽(Unicode)字符串。在转换方面,这会给混合物带来进一步的冲击。它不可能像演员一样简单。
但这并不意味着在类型之间进行转换是不可能的。有关MSDN的有用文档解释了how to convert between various C++ string types。
总之,您可以使用接受System::String
的相应重载构造函数将C样式字符串转换为char*
:
const char* cString = "Hello, World!";
System::String ^netString = gcnew System::String(cString);
Console::WriteLine(netString);
delete netString;
然后,当然,您可以将上述方法与std::string
方法相结合,从System::String
转换为c_str()
:
std::string stdString("Hello, World!");
System::String ^netString = gcnew System::String(stdString.c_str());
Console::WriteLine(netString);
delete netString;