Cómo usar literales de cadena ancha en c ++ sin poner L delante de cada uno
Pregunta
Tendrás que perdonar mi ignorancia, pero no estoy acostumbrado a usar juegos de caracteres anchos en c ++, pero ¿hay alguna manera de que pueda usar literales de cadena ancha en c ++ sin poner una L delante de cada literal?
Si es así, ¿cómo?
Solución
No, no lo hay. Debe usar el prefijo L (o una macro como _T () con VC ++ que se expande a L de todos modos cuando se compila para Unicode).
Otros consejos
El nuevo estándar C ++ 0x define otra forma de hacer esto:
http://en.wikipedia.org/wiki/C%2B%2B0x#New_string_literals
en una nota relacionada .. Estoy tratando de hacer lo siguiente
#define get_switch( m ) myclass::getSwitch(L##m)
que es una macro que se expandirá
get_switch(isrunning)
en
myclass::getswitch(L"isrunning")
esto funciona bien en c ++ visualstudio 2008
pero cuando compilo el mismo código en mac Xcode (para iphone) me sale el error:
error: 'L' was not defined in this scope.
EDITAR: Solución
#define get_switch( m ) myclass::getSwitch(L ## #m)
esto funciona tanto en vc ++ como en mac xcode (gcc)
¿Por qué no desea prefijar los literales de cadena con una L? Es bastante simple: las cadenas sin una L son cadenas ANSI ( const char *
), las cadenas con una L son cadenas de caracteres anchos ( const wchar_t *
). Existe la macro TEXT ()
, que convierte una cadena literal en un ANSI o una cadena de caracteres anchos dependiendo del proyecto actual que está configurado para usar Uncode:
#ifdef UNICODE
#define TEXT(s) L ## s
#else
#define TEXT(s) s
#endif
También existe la macro _T ()
, que es equivalente a TEXT ()
.