Что такое префикс L в C++?

Я понимаю, что он делает: указывает строковый литерал как const wchar_t * (широкая символьная строка) вместо const char * (простые старые символы), но как это на самом деле определено?

это какой-то макрос? Является ли он оператором для компиляторов GCC? Что?!--5-- > is это?

3 ответов


буквальные префиксы являются частью основного языка, как и суффиксы:

'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

отметим, что wchar_t и ничего делать с Unicode. Вот это моя расширенная тирада по теме.


это называется кодировка префикс:

2.14.5 строковые литералы [lex.string]

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

и помечает строку литерал:

11) строковый литерал, который начинается с L, например L"asdf", широкий строковый литерал. Широкий строковый литерал имеет тип " array of n const wchar_t", где N-размер строки, как определено ниже; он статическая длительность хранения и инициализируется заданными символами.


значение L здесь является широким символом:wchar_t. Строка с L кодируется в 16bit, а не 8bit, возьмем пример:

"A"    = 41
L"A"   = 00 41