static TCHAR szWindowClass[] = L"foo";
L
被“粘合”到字符串"foo"
上。怎么来的?我习惯的函数或宏类似于L("foo");
谁能解释一下 L 是怎么粘在绳子上的?
L
不是宏,它只是宽 ( wchar_t
, "Unicode") 字符串文字的标准前缀;这个概念类似于文字的L
后缀,long int
文字的f
后缀float
等等1。
顺便说一句,如果你使用TCHAR
s 你不应该L
直接使用;相反,您应该使用_T()
orTEXT()
宏,如果应用程序是为“Unicode”编译的(即定义为),它会L
在文字的开头添加,或者如果编译目标是“ANSI”(定义为),则不添加任何内容。TCHAR
WCHAR
TCHAR
CHAR
它不是宏,而是编译器将其识别为具有某些特殊含义的前缀的标记。
egl
作为产生long
文字的后缀也会发生同样的情况,如long x = 42l;
.
这不是宏,就像42ul
不是宏一样:它告诉编译器“foo”是一个宽字符串。
在旁注中,实际上“宽字符串”到底是什么并没有那么明确,因此它不是可移植的。除非您出于 API 原因必须使用 TCHAR / ,否则L"foo"
最好使用 C++11 Unicode 支持(如果您可以使用 C++11 支持):( u8"foo"
UTF-8) 或U"foo"
(UTF-32),加上适当的字符串/数组类型。
个人建议:不要使用 UTF-16。大多数人并不真正理解它,正如关于“宽”字符串的争论所证明的那样。;-)
这个怎么样?
#ifdef _UNICODE
#define L(str) L##str
#else
#define L(str) str
#endif
这个问题迟到了,但这在几年前就困扰了我。这是一些文档的链接,给出了 L 的定义以及其他一些文档。
L " (unescaped_character|escaped_character)* " (2)
2) Wide string literal. The type of a L"..." string literal is const wchar_t[].
还有一篇关于新字符串文字的维基百科文章
基于@Doo Hyeok Kim 改进它
#define DIAG "diag"
// innerally macro
#define __W(quote_string) L ## quote_string
// robust macro
#define _W(quoted_string_or_defined_string) __W(quoted_string_or_defined_string)
//std::wcout << _W(DIAG) << ", " << _W("_W(\"diag2\")") << ", " << __W("__W(\"diag3\")") <<std::endl;