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