Как использовать широкие строковые литералы в C++, не ставя L перед каждым из них
вы должны простить мое невежество, но я не привык использовать широкие наборы символов в c++, но есть ли способ использовать широкие строковые литералы в c++, не ставя L перед каждым литералом?
Если да, то как?
4 ответов
нет, нет. Вы должны использовать префикс 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")
это прекрасно работает в C++ visualstudio 2008
но когда я компилирую тот же код под mac Xcode (для iphone), я получаю ошибку:
error: 'L' was not defined in this scope.
EDIT: решение
#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()
.