Как использовать широкие строковые литералы в 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().