58

我了解它的作用:将字符串文字指定为const wchar_t *(宽字符串)而不是const char *(普通旧字符),但它实际上是如何定义的?

它是某种宏吗?它是 GCC 编译器的运算符吗?它是什么?

4

3 回答 3

83

字面前缀是核心语言的一部分,很像后缀:

'a'    // type: char
L'a'   // type: wchar_t

"a"    // type: char[2]
L"a"   // type: wchar_t[2]
U"a"   // type: char32_t[2]

1      // type: int
1U     // type: unsigned int

0.5    // type: double
0.5f   // type: float
0.5L   // type: long double

请注意,与 Unicodewchar_t无关。这是我关于这个话题的一个扩展的咆哮。

于 2012-10-26T12:51:07.673 回答
20

它被称为编码前缀

2.14.5 字符串文字 [lex.string]

string-literal:
| encoding-prefixopt" s-char-sequenceopt"
| encoding-prefixopt回复raw-string
encoding-prefix
| u8
| u
| U
| L

并标记一个宽字符串文字:

11) 以 开头的字符串文字L,例如L"asdf",是宽字符串文字。宽字符串字面量的类型为“array of n const wchar_t”,其中 n 是字符串的大小,定义如下;它具有静态存储持续时间并使用给定字符进行初始化。

于 2012-10-26T12:52:47.930 回答
7

这里 L 的意思是宽字符:wchar_t. 带 L 的字符串是 16 位而不是 8 位编码的,举个例子:

"A"    = 41
L"A"   = 00 41
于 2014-07-29T19:09:36.333 回答