为什么从char *到LPCWSTR的自动转换仅在未设置字符集时才有效

时间:2015-05-25 17:15:03

标签: c++ c++11 visual-c++ casting

我对C ++完全陌生(我刚开始玩30分钟)。我曾尝试按照this教程,但第一个代码段无效:

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
   MessageBox(NULL, "Goodbye, cruel world!", "Note", MB_OK);
   return 0;
}

编译器在将两个字符串值转换为LPCWSTR类型时遇到问题。

错误消息是:

argument of type "char" is incompatible with parameter of type "LPCWSTR"

第一个解决方案是在前面添加一个L来转换它。

MessageBox(NULL, L"Goodbye, cruel world!", L"Note", MB_OK);

但后来我找到了第二个解决方案here,它将字符集从unicode设置为未设置:

我的第一个问题是,当我用F作为字符串前缀时,会发生什么?它与C#中的强制转换相同吗?

// Casting example, C# code
double x = 1234.7;
int a;
a = (int)x;

我的第二个问题是我在设置字符集时究竟发生了什么,以及为什么在设置为Not Set时可以进行自动转换?

1 个答案:

答案 0 :(得分:0)

字符编码在C ++中始终是一个棘手的问题,因为该语言没有内置的Unicode支持,这意味着字符串始终是char*wchar_t*。该标准定义了一些声明字符串文字的方法,如here所示。

没有“强制转换”:编译器将查看您的文字,并根据您放在字符串前面的前缀进行转换。项目选项会更改Windows API函数所期望的字符串类型。如果你发送不匹配的字符串,你将得到编译时错误(如果你在一个中使用宽字符而不是另一个)或字符显示中的某些问题,因为程序获得不同的编码。例如,如果您将编码设置为unicode但是声明了不带u8前缀的字符串,则非ASCII字符将显示错误。

如果你强制转换宽字符和带有强制转换的小字符之间的转换,你的字符串将被破坏,在某些情况下,可能无法读取空终止符,你将崩溃你的程序。因此,如果您看到(char*)(wchar_t*),您就会更清楚地知道自己在做什么。