Как использовать широкие строковые литералы в C++, не ставя L перед каждым из них
Вопрос
Вам придется простить мое невежество, но я не привык использовать широкие наборы символов в C++, но есть ли способ использовать широкие строковые литералы в C++, не ставя L перед каждым литералом?
Если да, то как?
Решение
Нет, нет. Вы должны использовать префикс L (или макрос, такой как _T () с VC ++, который в любом случае расширяется до L при компиляции для Unicode).
Другие советы
Новый стандарт C ++ 0x определяет другой способ сделать это:
http://en.wikipedia.org/wiki/C%2B%2B0x#New_string_literals р>
по соответствующей заметке..я пытаюсь сделать следующее
#define get_switch( m ) myclass::getSwitch(L##m)
это макрос, который будет расширяться
get_switch(isrunning)
в
myclass::getswitch(L"isrunning")
это отлично работает в С++ 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)
Почему вы не хотите ставить префикс строковых литералов буквой 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 ()
.