2011-02-28 14 views
10

¿Es posible escribir un #define que define un #define?¿Cómo se define una definición en C?

Por ejemplo:

#define FID_STRS(x) #x 
#define FID_STRE(x) FID_STRS(x) 
#define FID_DECL(n, v) static int FIDN_##n = v;static const char *FIDS_##n = FID_STRE(v) 

Pero en su lugar:

#define FID_DECL2(n, v) #define FIDN_##n v \ 
           FIDS_##n FID_STRE(v) 

FID_DECL funciona bien, pero crea dos variables estáticas. ¿Es posible hacer que FID_DECL2 funcione y tener que definir dos define?

+1

"dos variables estáticas" reccursive va Cuál es el problema con esto? –

+0

http://stackoverflow.com/questions/5136471/multi-pass-c-preprocessor – aaz

+0

@James: Dos variables estáticas están bien, excepto que la definición de cadena que quiero contactar con mi cadena: FID_DECL (HELLO, 2) printf ("Hola mundo" FIDS_HELLO) -> "Hola mundo2" –

Respuesta

12

No; el preprocesamiento se realiza en una sola pasada. Si quiere o necesita un comportamiento más avanzado, considere usar otra herramienta para preprocesar la fuente, como m4.

Además, la # en la lista de reemplazo (al comienzo de #define FIDN... serían analizados como el (operador de # stringize): el operando de este operador debe ser un parámetro de macro llamado, que define no es

0

. sin mientras que la definición de macros u debe cuidar de una cosa que macro no debe llamarse a sí misma (reccursively) ya sea directamente o indirectamente .

conozco a dos variables estáticas que consumen 8 bytes serán expansiva para u.

tengo solución sobre ella

#define FID_STRS2(x) #x 
#define FID_STRE(x) FID_STRS2(x) 
#define FID_DECL(n, v) static int FIDN_##n = v;static const char *FIDS_##n = FID_STRE(v) 

Sólo cambiar el nombre de ellos

Cuestiones relacionadas