10
static TCHAR szWindowClass[] = L"foo";

L被“粘合”到字符串"foo"上。怎么来的?我习惯的函数或宏类似于L("foo");

谁能解释一下 L 是怎么粘在绳子上的?

4

6 回答 6

18

L不是宏,它只是宽 ( wchar_t, "Unicode") 字符串文字的标准前缀;这个概念类似于文字的L后缀,long int文字的f后缀float等等1

顺便说一句,如果你使用TCHARs 你不应该L直接使用;相反,您应该使用_T()orTEXT()宏,如果应用程序是为“Unicode”编译的(即定义为),它会L在文字的开头添加,或者如果编译目标是“ANSI”(定义为),则不添加任何内容。TCHARWCHARTCHARCHAR


  1. 尽管在我看来这很令人困惑——为什么算术类型的后缀和宽字符串文字的前缀?
于 2012-11-14T13:12:27.920 回答
4

它不是宏,而是编译器将其识别为具有某些特殊含义的前缀的标记。

egl作为产生long文字的后缀也会发生同样的情况,如long x = 42l;.

于 2012-11-14T13:14:32.423 回答
4

这不是宏,就像42ul不是宏一样:它告诉编译器“foo”是一个字符串。

在旁注中,实际上“宽字符串”到底是什么并没有那么明确因此它不是可移植的。除非您出于 API 原因必须使用 TCHAR / ,否则L"foo"最好使用 C++11 Unicode 支持(如果您可以使用 C++11 支持):( u8"foo"UTF-8) 或U"foo"(UTF-32),加上适当的字符串/数组类型。

个人建议:不要使用 UTF-16。大多数人并不真正理解它,正如关于“宽”字符串的争论所证明的那样。;-)

于 2012-11-14T13:15:13.637 回答
1

这个怎么样?

#ifdef _UNICODE

#define L(str) L##str

#else

#define L(str) str

#endif

于 2016-01-13T15:06:58.880 回答
0

这个问题迟到了,但这在几年前就困扰了我。这是一些文档的链接,给出了 L 的定义以及其他一些文档。

cppreference.com 字符串文字

L " (unescaped_character|escaped_character)* " (2)
2) Wide string literal. The type of a L"..." string literal is const wchar_t[].

还有一篇关于新字符串文字的维基百科文章

于 2017-02-13T20:19:34.540 回答
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;
于 2017-02-07T10:33:18.660 回答