如何定义“L”宏(?)?

时间:2012-11-14 13:10:45

标签: c winapi

static TCHAR szWindowClass[] = L"foo";

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

任何人都可以解释我怎么会粘在绳子上?

6 个答案:

答案 0 :(得分:15)

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

顺便说一句,如果您使用的是TCHAR,则不应直接使用L;相反,你应该使用_T()TEXT()宏,如果应用程序是为“Unicode”编译的,那么在文字的开头添加L(即定义了TCHARWCHAR),如果编译目标是“ANSI”(TCHAR定义为CHAR),则不添加任何内容。


  1. 虽然在我看来这很令人困惑 - 为什么算术类型的后缀和宽字符串文字的前缀?

答案 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[].

还有关于new string literals

的维基百科文章