Как использовать широкие строковые литералы в C++, не ставя L перед каждым из них

StackOverflow https://stackoverflow.com/questions/260125

  •  06-07-2019
  •  | 
  •  

Вопрос

Вам придется простить мое невежество, но я не привык использовать широкие наборы символов в 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 () .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top