static TCHAR szWindowClass[] = L"foo";
L
被“粘贴”在字符串"foo"
上。怎么会?我习惯的函数或宏类似于L("foo");
任何人都可以解释我怎么会粘在绳子上?
答案 0 :(得分:15)
L
不是宏,它只是宽(wchar_t
,“Unicode”)字符串文字的标准前缀;该概念类似于L
文字的long int
后缀,f
文字的float
后缀等等 1 。
顺便说一句,如果您使用的是TCHAR
,则不应直接使用L
;相反,你应该使用_T()
或TEXT()
宏,如果应用程序是为“Unicode”编译的,那么在文字的开头添加L
(即定义了TCHAR
如WCHAR
),如果编译目标是“ANSI”(TCHAR
定义为CHAR
),则不添加任何内容。
答案 1 :(得分:4)
它不是宏,它是编译器识别为具有某些特殊含义的前缀的标记。
同样的情况发生在例如l
作为产生long
文字的后缀,如long x = 42l;
中所示。
答案 2 :(得分:4)
这不是宏,就像42ul
不是宏一样:它告诉编译器“foo”是宽字符串。
在旁注中,实际上 的确是一个“宽字符串”的定义并不明确,因此它不可移植。除非您因为API原因 使用TCHAR / L"foo"
,否则最好使用C ++ 11 Unicode支持(如果您可以使用C ++ 11支持):{{ 1}}(UTF-8)或u8"foo"
(UTF-32),以及相应的字符串/数组类型。
个人建议:不要使用UTF-16。大多数人并不真正理解它,正如对“宽”字符串的争论所证明的那样。 ; - )
答案 3 :(得分:1)
这个怎么样?
#ifdef _UNICODE
#define L(str) L##str
#else
#define L(str) str
#endif
答案 4 :(得分:0)
根据@ 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;
答案 5 :(得分:0)
这个问题的后期,但多年前这个问题让我感到困惑。这里有一些文档的链接,给出了L加上其他一些文档的定义。
cppreference.com string literal
L " (unescaped_character|escaped_character)* " (2)
2) Wide string literal. The type of a L"..." string literal is const wchar_t[].
的维基百科文章