Como usar literais de cordas largas em C ++ sem colocar L na frente de cada um
Pergunta
Você terá que perdoar minha ignorância, mas não estou acostumado a usar grandes conjuntos de caracteres em C ++, mas existe uma maneira de usar literais de cordas amplas em C ++ sem colocar um L na frente de cada literal?
Se sim, como?
Solução
Não, não há. Você deve usar o prefixo L (ou uma macro como _t () com VC ++ que se expande para L de qualquer maneira quando compilado para unicode).
Outras dicas
O novo padrão C ++ 0x define outra maneira de fazer isso:
http://en.wikipedia.org/wiki/C%2B%2B0X#New_String_literals
em uma nota relacionada .. estou tentando fazer o seguinte
#define get_switch( m ) myclass::getSwitch(L##m)
que é uma macro que se expande
get_switch(isrunning)
em
myclass::getswitch(L"isrunning")
Isso funciona bem no C ++ VisualStudio 2008
Mas quando compilar o mesmo código no Mac Xcode (para iPhone), recebo o erro:
error: 'L' was not defined in this scope.
Editar: Solução
#define get_switch( m ) myclass::getSwitch(L ## #m)
Isso funciona no VC ++ e Mac Xcode (GCC)
Por que você não quer prefixar literais de string com um L? É bastante simples - strings sem um l são strings ANSI (const char*
), strings com um L são cordas de grande caractere (const wchar_t*
). Existe o TEXT()
Macro, que faz de uma corda literal em um ANSI ou uma string ampla, dependendo do projeto atual, está definido para usar o UNCODE:
#ifdef UNICODE
#define TEXT(s) L ## s
#else
#define TEXT(s) s
#endif
Há também o _T()
macro, que é equivalente a TEXT()
.