2012-07-23 29 views
7

Quiero saber el motivo detrás de la salida de este código. No pude encontrar una respuesta.Preprocesador C: macro macro e identidad de stringize

#define f(a,b) a##b 
#define g(a) #a 
#define h(a) g(a) 
void main() 
{ 
    printf("%s %s",h(f(1,2)),g(f(1,2))); 
} 

PS: la salida es 12 f(1,2). Pensé que era 12 12 o f(1,2) f(1,2).

+3

solo para aprender a trabajar con el preprocesador ... – Dhatri

+3

@cnicutar Creo que lo encontró aquí: http://cracktheinterviewers.blogspot.com/2012_03_01_archive.html – Dave

+0

no fue escrito por mí ... se lo preguntaron en una prueba. – Dhatri

Respuesta

4
h(f(1,2)) 

f(1,2) está sustituido por a. a no es el tema de un operador # o ## por lo que se amplió a 12. Ahora tiene g(12) que se expande a "12".

g(f(1,2)) 

f(1,2) está sustituido por a. El operador # aplicado a a impide la expansión de macro, por lo que el resultado es literalmente "f(1,2)".

+0

oh ... ok gracias ... no me concentré en el funcionamiento del operador # – Dhatri

+0

@vindhya Todo es un desastre. – Potatoswatter

2

Simplemente haga los reemplazos.

h(f(1, 2)) -> g(12) -> "12" 

g(f(1,2)) -> "f(1, 2)" 

También debe ver here.

+0

para el el segundo también g (f (1,2)) puede ser g (12) y 12 ¿no? – Dhatri

Cuestiones relacionadas