2012-07-23 36 views
7

Voglio conoscere il motivo dietro l'output di questo codice. Non sono riuscito a trovare una risposta.preprocessore C: stringize macro macro e identità

#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: l'output è 12 f(1,2). Ho pensato che fosse 12 12 o f(1,2) f(1,2).

+3

solo per imparare il preprocessore lavorando ... – Dhatri

+3

@cnicutar Penso che l'abbia trovato qui: http://cracktheinterviewers.blogspot.com/2012_03_01_archive.html – Dave

+0

non è stato scritto da me.è stato chiesto in una prova. – Dhatri

risposta

4
h(f(1,2)) 

f(1,2) è sostituito a. a non è l'oggetto di un operatore # o ## quindi è espanso a 12. Ora hai g(12) che si espande a "12".

g(f(1,2)) 

f(1,2) è sostituito a. L'operatore # applicato a a impedisce l'espansione della macro, quindi il risultato è letteralmente "f(1,2)".

+0

oh ... ok grazie ... non mi sono concentrato sul funzionamento dell'operatore # – Dhatri

+0

@vindhya È tutto un casino sanguinoso. – Potatoswatter

2

Basta fare le sostituzioni.

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

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

Si dovrebbe anche vedere here.

+0

per il la seconda anche g (f (1,2)) può essere g (12) e 12 destra? – Dhatri

Problemi correlati