2010-03-11 24 views
29

¿Se puede hacer algo como esto con una macro en C?Preprocesador C Macro que define Macro

#define SUPERMACRO(X,Y) #define X Y 

then 

SUPERMACRO(A,B) expands to #define A B 

Tengo una sensación no porque el preprocesador solo hace una pasada.

solo gcc oficial. No hay herramientas de terceros, por favor.

Respuesta

23

Las macros no se pueden expandir a las directivas de preprocesamiento. De C99 6.10.3.4/3 "Reescaneado y más de reemplazo":

El resultante completamente-macro reemplazado preprocesamiento secuencia de tokens no se procesa como una directiva de preprocesamiento incluso si se asemeja a uno,

2

Lo sentimos, no puede. Puede llamar a otras macros en macros pero no definir nuevas.

+0

¿qué tal si hizo 2 pasadas del preprocesador – pm100

+1

La sintaxis no es válida. # es una especie de carácter reservado en macros. # debe ir seguido de un parámetro de macro para que sea válido. Esto 'stringify' el parámetro. –

3

No. El orden de las operaciones es tal que todas las directivas de preprocesador se reconocen antes de que se realice cualquier macro expansión; por lo tanto, si una macro se expande en algo que se parece a una directiva de preprocesador, no se reconocerá como tal, sino que se interpretará como texto fuente de C (erróneo).

12

No puede definir macros en otras macros, pero puede invocar una macro desde su macro, que puede obtener esencialmente los mismos resultados.

#define B(x) do {printf("%d", (x)) }while(0) 
#define A(x) B(x) 

así, A(y) se expande a do {printf("%d", (y)) }while(0)

0

Usted podría intentar la ejecución a través de sólo la opción de preproceso, a continuación, compilar con el archivo preprocesado.

0

Es posible hacer esto sin embargo: #define Supermacro (X, Y) define X Y

A continuación, puede utilizar la funcionalidad editores macro-expansión y pegar en el que falta #.

O incluso mejor: utilice un lenguaje de procesamiento de cadenas diferente y más potente como su preprocesador.