Что именно является префиксом L в C++?

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

Это какой-то макрос? Это оператор для компиляторов GCC? Что это такое

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-prefixopt р raw-string
encoding-prefix:
| u8
| u
| U
| L

и отмечает широкий строковый литерал:

11) Строковый литерал, который начинается с L, такие как L"asdf", является широким строковым литералом. Широкий строковый литерал имеет тип "массив nconst wchar_t ”, Где n - размер строки, как определено ниже; он имеет статическую продолжительность хранения и инициализируется заданными символами.

Смысл L здесь широкий характер: wchar_t, Строка с L закодирована в 16-битном, а не 8-битном, возьмем пример:

"A"    = 41
L"A"   = 00 41
Другие вопросы по тегам