初始化System :: String ^ with literal但不是string :: c_str()或char []

时间:2012-01-27 01:16:19

标签: c++ .net string c++-cli console.writeline

我最近开始学习.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以某种方式将文字转换为它自己的东西吗?

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

1 个答案:

答案 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::stringchar[]类型只接受“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;