为什么我需要在字符串前面加一个L并正确创建这个变量?

时间:2017-03-15 17:44:42

标签: c++ string wchar-t

我是C ++的新手,我很难完全理解数据类型的用法。

我将这些变量应用于createwindow参数以及带有它的类。这需要LPCWSTR数据类型。

LPCWSTR szTitle = L"Hello";
LPCWSTR szWindowClass = L"There";

因此,我这样做了,但是,我不明白为什么我必须在字符串之前包含L(调试器把它放在那里说实话)。我也经常看到字符串被定义为直接类型(相反,我经常看到WCHAR,char等)。如果你要制作这些变量,你会怎么写呢?我不相信我应该使用LPCWSTR。再说一遍,我很新,我无法找到我在网上寻找的确切内容。

2 个答案:

答案 0 :(得分:5)

C ++有几种不同的字符类型,这里的问题是charwchar_twchar_t是某些实现的宽字符 - 定义的类型。 C ++中的字符串文字被视为字符数组,因此您可以编写

const char* rawString = "I'm a regular old string!";

因为charwchar_t不一定是同一类型,所以你不能写

const wchar_t* rawString = "I'm a regular old string!"; // Error!

因为类型不匹配:右侧有char个数组,左侧有const wchar_t*类型的指针。因此,C ++允许您通过在字符串文字前加L前缀来定义宽字符串文字。结果字符串是wchar_t类型的元素数组,所以这将编译:

const wchar_t* rawString = L"I'm a wide string!"; // Totally fine!

Microsoft的别名LPCWSTR基本上是const wchar_t*,这就是您需要L前缀的原因。

答案 1 :(得分:0)

有一种方法可以通过项目设置使用TCHAR类型和相关函数以及宏来安装Ansi和Unicode,但Ansi最后用于Windows NT和旧版本。切换到Unicode是为Windows 2000及更高版本完成的,因此tchar的东西是遗留的,但Visual Studio仍会在某些类型的项目上使用tchar创建默认应用程序。

http://msdn.microsoft.com/en-us/library/windows/desktop/ff381407(v=vs.85).aspx

还有一些基于TCHAR的字符串函数。

对于字符串而不是L,您可以使用TEXT()宏

http://msdn.microsoft.com/en-us/library/windows/desktop/dd374074(v=vs.85).aspx

例如TEXT(“示例字符串”)。这将根据字符集的项目设置创建ansi字符串或unicode字符串。您需要为TEXT宏包含windows.h。

同样,这是遗留代码,但如果Visual Studio为您创建默认源程序,它可能会使用与TCHAR相关的东西。