2012-05-24 35 views
6

Como _T() macro en Visual Studio, que define y utiliza mi propia _L macro como:cómo definir macro para convertir char string concatenado a wchar_t cadena en C

#define _L(x) __L(x) 
#define __L(x) L ## x 

Funciona para:

wprintf(_L("abc\n")); 

Pero consigue un error de compilación para:

wprintf(_L("abc\n""def\n")); 

Se informa "literales de cadena con tipos de caracteres diferentes no se pueden concatenar".
También hice:

#define _L2(x) __L2(x) 
#define __L2(x) L ## #x 
wprintf(_L2("abc\n""def\n")); 

El código se compila, pero el \n no funciona como una secuencia de escape de una nueva línea. El \n se convierte en dos personajes, y la salida de wprintf es:

"abc \ n" "def \ n"

¿Cómo puedo tener una macro para convertir dos char string concatenado a wchar_t? El problema es que tengo algunas macros ya existentes:

#define BAR "The fist line\n" \ 
      "The second line\n" 

Quiero encubierta a una cadena wchar durante la compilación. El compilador es ICC en Windows.

Editar:
Los _L macro funciona en gcc, el MSVC e ICC hizo no tiene obras, es un error del compilador. Gracias @R .. para comentarme.

+0

Si mal no recuerdo, no necesita escribir macro. Simplemente coloque la cadena una al lado de la otra y se concatenarán automáticamente en una. Al menos eso funciona para gcc. – nhahtdh

+4

Esto es puramente un error en MSVC. Los lenguajes C permiten concatenar cadenas de ancho diferente, y el resultado es una cadena ancha. –

+0

@nhahtdh No debo hacer dos cadenas. Quiero convertir cadenas contactadas a wchar. – RolandXu

Respuesta

2

No creo que pueda hacer esto.

Las macros simplemente hacen un procesamiento de texto simple. Pueden agregar L al principio, pero no pueden decir que "abc\n" "def\n" son dos cadenas, que necesitan agregar L dos veces.

Puede progresar si pasa las cuerdas a la macro separados por comas, en lugar de concatena:
L("abc\n", "def\n")

Es trivial para definir L que acepte exactamente dos cadenas:
#define L2(a,b) _L(a) _L(b)
generalizándola tener una sola macro que obtenga cualquier cantidad de parámetros y que agregue L en el lugar correcto es posible, pero más complicado. Puede encontrar macros inteligentes haciendo tales cosas en Jens Gustedt's P99 macros.

+0

+1 para el enlace a P99. – 0xC0000022L

+0

Sí, puedo, si el compilador de C admite el estándar C99 correctamente, como GCC. otra pregunta decía esto http://stackoverflow.com/questions/2192416/how-to-convertnations-concatenated-strings-to-wide-char-with-the-c-preprocessor – RolandXu

+0

@RolandXu, el preprocesador no puede hacer qué él quiere, es decir, genera 'L" abc "L" def "'. El compilador puede (aunque MSVC parece que no) tratar 'L" abc "" def "' como una cadena ancha por completo. – ugoren