Что делает L? - PullRequest
       18

Что делает L?

10 голосов
/ 15 апреля 2011

Что это делает?

const wchar_t *s = L"test";

Если на моей машине wchar_t составляет два байта, то почему мы должны указывать компилятору, что строка должна обрабатываться так, чтобы каждый элемент был длинным, т.е. четыре байта в размере?

Ответы [ 5 ]

15 голосов
/ 15 апреля 2011

L означает, что строка является строкой wchar_t символов, а не обычной строкой char символов. Я не уверен, откуда вы взяли бит около четырех байтов.

Из раздела спецификаций 6.4.5 Строковые литералы , абзац 2:

A строковый литерал - это последовательность из нуля или более многобайтовых символов, заключенных в двойные кавычки, как в "xyz". широкий строковый литерал такой же, за исключением префикса с буквой L.

И выдержка из пункта 5:

Для строковых литералов символов элементы массива имеют тип char и инициализируются отдельными байтами многобайтовой последовательности символов; для широких строковых литералов элементы массива имеют тип wchar_t и инициализируются последовательностью широких символов, соответствующих многобайтовому символу последовательность, определенная функцией mbstowcs с текущим языковым стандартом, определяемым реализацией.

5 голосов
/ 15 апреля 2011

L не означает long integer при добавлении префикса в строку. Это означает, что каждый символ в строке является широким символом.

Без этого префикса вы присваиваете строку char указателю wchar_t, что было бы несовпадением.

5 голосов
/ 15 апреля 2011

В случае сомнений обратитесь к стандарту (§6.4.5, Строковые литералы):

A строковый литерал является последовательность из нуля или более многобайтовых символы, заключенные в двойные кавычки, как в "xyz". широкий строковый литерал является то же самое, за исключением префикса письмо L.

Обратите внимание, что не указывает , что каждый символ является long, несмотря на то, что перед ним стоит та же буква, что и буквенный суффикс long.

2 голосов
/ 15 апреля 2011

Если вы не знаете, что делает L, то почему вы делаете напористое заявление о том, что каждый элемент массива long («размером четыре байта»)? Откуда пришла эта идея с long?

То, что L имеет такое же отношение к long, как и к "лепрекону" - никакого отношения вообще. Префикс L означает, что следующий строковый литерал состоит из широких символов, то есть каждый символ имеет тип wchar_t.

P.S. Наконец, всегда полезно использовать константные указатели при указании строковых литералов: const wchar_t *s = L"test";.

2 голосов
/ 15 апреля 2011

Указывает строку широких символов типа wchar_t.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...