Как использовать широкие строковые литералы в c ++, не ставя перед каждым из них L - PullRequest
13 голосов
/ 04 ноября 2008

Вам придется простить мое невежество, но я не привык использовать широкие наборы символов в c ++, но есть ли способ, которым я могу использовать широкие строковые литералы в c ++, не помещая L перед каждым литералом?

Если да, то как?

Ответы [ 4 ]

25 голосов
/ 04 ноября 2008

Нет, нет. Вы должны использовать префикс L (или макрос, такой как _T () с VC ++, который в любом случае расширяется до L при компиляции для Unicode).

18 голосов
/ 04 ноября 2008

Новый стандарт C ++ 0x определяет другой способ сделать это:
http://en.wikipedia.org/wiki/C%2B%2B0x#New_string_literals

3 голосов
/ 26 января 2009

на связанной ноте .. я пытаюсь сделать следующее

#define  get_switch( m )   myclass::getSwitch(L##m)

, который является макросом, будет расширяться

get_switch(isrunning)

в

myclass::getswitch(L"isrunning")

это прекрасно работает в c ++ visualstudio 2008

но когда я компилирую тот же код в Mac Xcode (для iphone), я получаю ошибку:

error: 'L' was not defined in this scope.

РЕДАКТИРОВАТЬ: Решение

#define  get_switch( m )   myclass::getSwitch(L ## #m)

это работает как на vc ++, так и на mac xcode (gcc)

1 голос
/ 04 ноября 2008

Почему вы не хотите ставить префикс строковых литералов буквой L? Это довольно просто - строки без L - это строки ANSI (const char*), строки с L - это строки широких символов (const wchar_t*). Существует макрос TEXT(), который переводит строку в ANSI или в строку широких символов, в зависимости от текущего проекта, используется Uncode:


#ifdef UNICODE
#define TEXT(s) L ## s
#else
#define TEXT(s) s
#endif

Существует также макрос _T(), который эквивалентен TEXT().

...