L'A 'и' A 'полностью одинаковы? - PullRequest
3 голосов
/ 17 марта 2010

Когда мы пишем программу, которая поддерживает как Unicode, так и многобайтовые,
мы часто используем макрос _T ("некоторая строка") для строк.

Но нужно ли персонажу оборачивать этот макрос?

Являются ли L'A 'и' A 'полностью одинаковыми?
Разве нам не нужно оборачивать _T ('A') для символа?

Ответы [ 4 ]

5 голосов
/ 17 марта 2010

Нет, L'A - это символ Unicode типа wchar_t, в то время как A - символ ASCII типа char. Вот строковые литералы MSDN .

3 голосов
/ 17 марта 2010

Если вы напишите 'A', и это значение будет преобразовано в wchar_t, то, по крайней мере, в компиляторах Microsoft оно будет иметь то же значение, что и при написании L'A' или _T('A').

То же самое нельзя сказать о строковых литералах, поскольку нет полезного преобразования из const char* в const wchar_t*. Я думаю, это означает, что гораздо менее важно правильно понять типы литералов символов, чем строковые литералы.

Легко написать код, который ведет себя по-разному в зависимости от того, является ли символьный литерал широким или узким - просто есть перегруженная функция, которая делает что-то совершенно другое. Но на практике разумные функции, перегруженные для приема обоих типов символов, в конечном итоге будут делать то же самое с 'A', что и с L'A'. А функции, которые не перегружены и занимают только wchar_t, могут нормально работать 'A'.

Я не сразу вижу в стандарте ничего, что требовало бы L'A' == (wchar_t)'A', поэтому теоретически компиляторы сторонних разработчиков могут сделать что-то совершенно другое. Но вы обычно ожидаете, что широкий набор символов будет расширением узкого набора символов, так же как Unicode расширяет ISO-8859-1. Чтобы быть точным, что означает «расширение», кодовые точки, которые равны целым числам, обозначают «один и тот же символ».

1 голос
/ 17 марта 2010

L'A '- это wchar_t ,' A '- char . Они бывают разных типов, а также имеют разные размеры.

Вы должны использовать _T ('A'), который добавляет L к литералу, если определен макрос _UNICODE.

0 голосов
/ 17 марта 2010

_T - это макрос из Visual Studio, если в свойствах вашего проекта свойство Набор символов, установленное на «Использовать многобайтовые символы», _T будет заменено пустой строкой, если оно будет установлено на «Использовать набор символов Юникода», _T будет заменить на Л. Этот макрос определен для простого преобразования проекта из набора символов Unicode-> ASCII без каких-либо дополнительных изменений

...