Что делает L?
Что это делает?
const wchar_t *s = L"test";
Если wchar_t - это два байта на моей машине, то почему мы должны сообщать компилятору, что строка должна обрабатываться так, чтобы каждый элемент был длинным, т.е. размером четыре байта?
Ответы
Ответ 1
Если вы сомневаетесь, обратитесь к стандарту (§6.4.5, String Literals):
Литеральный символ символьной строки является последовательность с нулевым или более многобайтным символы, заключенные в двойные кавычки, как в "xyz"
. Широкий строковый литерал то же самое, кроме префикса письмо L
.
Обратите внимание, что не указывает, что каждый символ является long
, несмотря на то, что он имеет префикс с той же буквой, что и буквенный суффикс long
.
Ответ 2
L
означает, что строка представляет собой строку символов wchar_t
, а не обычную строку символов char
. Я не уверен, где вы получили бит из четырех байтов.
В разделе spec 6.4.5 Строковые литералы, пункт 2:
Литеральный символ строки представляет собой последовательность из нулевых или более многобайтовых символов, заключенных в двойные кавычки, как в "xyz"
. Широкий строковый литерал тот же, кроме префикса буквой L
.
И выдержка из параграфа 5:
Для символьных строковых литералов элементы массива имеют тип char
и инициализируются отдельными байтами многобайтовой последовательности символов; для широких строковых литералов элементы массива имеют тип wchar_t
и инициализируются последовательностью широких символов, соответствующих многобайтовому символу последовательность, определенная с помощью функции mbstowcs
с текущей локалью, определяемой реализацией.
Ответ 3
L
не означает long integer
при префиксах строки. Это означает, что каждый символ в строке является широким символом.
Без этого префикса вы присваиваете строку char
указателю wchar_t
, что было бы несоответствием.
Ответ 4
Указывает строку с широкими символами типа wchar_t
.
Ответ 5
Если вы не знаете, что делает этот L
, то почему вы утверждаете утверждение о том, что каждый элемент массива имеет значение long
( "четыре байта по размеру" )? Откуда взялась эта идея с long
?
То, что L
имеет такое же отношение к long
, что и для "leprechaun" - никакого отношения вообще. Префикс L
означает, что следующий строковый литерал состоит из широких символов, то есть каждый символ имеет тип wchar_t
.
P.S. Наконец, всегда рекомендуется использовать константные указатели при указании на строковые литералы: const wchar_t *s = L"test";
.