1

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

为了向串口写入一行,我使用了WriteLine带参数的函数,System::String^. 我想知道是否可以System::String^std::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 是否以某种方式将文字转换为它自己的东西?

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

4

1 回答 1

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始终是一个更好的选择,它甚至提供了c_str()您在调用需要 char 数组的 API 函数时已经知道要使用的方法。但与其他两种字符串类型一样,这一种也不能相互转换。

std::string您将遇到的一个特别大的问题是char[]类型只接受“窄”(非 Unicode)字符串,而 .NET FrameworkSystem::String类型只适用于宽(Unicode)字符串。当涉及到转换时,这会进一步影响组合。不可能像演员表那样简单。

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

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

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

然后,当然,您可以通过将上述方法与方法相结合来转换 from to std::stringto :System::Stringc_str()

std::string stdString("Hello, World!");
System::String ^netString = gcnew System::String(stdString.c_str());
Console::WriteLine(netString);
delete netString;
于 2012-01-27T01:33:40.157 回答