2012-07-23 20 views
7

Chcę poznać przyczynę wyjścia tego kodu. Nie mogłem wymyślić odpowiedzi.Preprocesor C: makro i makro makra stringi

#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: wyjście to 12 f(1,2). Myślałem, że to było 12 12 lub f(1,2) f(1,2).

+3

po prostu nauczyć się pracy preprocesora ... – Dhatri

+3

@cnicutar Myślę, że znalazł go tutaj: http://cracktheinterviewers.blogspot.com/2012_03_01_archive.html – Dave

+0

nie został napisany przeze mnie ... został poproszony w teście. – Dhatri

Odpowiedz

4
h(f(1,2)) 

f(1,2) zastąpiono a. a nie jest przedmiotem operatora # lub ##, dlatego jest rozszerzany do 12. Teraz masz g(12), który rozwija się do "12".

g(f(1,2)) 

f(1,2) zastąpiono a. Operator # zastosowany do a zapobiega rozszerzaniu makr, więc wynikiem jest dosłownie "f(1,2)".

+0

oh ... ok dzięki ... nie skupiałem się na działaniu # operatora – Dhatri

+0

@vindhya To wszystko jest krwawym bałaganem. – Potatoswatter

2

Po prostu dokonaj wymiany.

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

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

Powinieneś również zobaczyć here.

+0

dla drugi też g (f (1,2)) może być g (12) a 12 w prawo? – Dhatri