Что делает 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";.