2012-07-23 21 views
7

Ich möchte den Grund für die Ausgabe dieses Codes wissen. Ich konnte keine Antwort finden.C Präprozessor: stringize Makro und Identität Makro

#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: Ausgabe ist 12 f(1,2). Ich dachte, es wäre 12 12 oder f(1,2) f(1,2).

+3

nur um Präprozessor arbeiten zu lernen ... – Dhatri

+3

@cnicutar Ich denke, er fand es hier: http://cracktheinterviewers.blogspot.com/2012_03_01_archive.html – Dave

+0

es wurde nicht von mir geschrieben..es wurde in einem Test gefragt. – Dhatri

Antwort

4
h(f(1,2)) 

f(1,2) für a substituiert ist. a ist nicht Gegenstand einer oder ## Operator, so dass es auf 12 erweitert wird. Jetzt haben Sie g(12), die zu "12" erweitert.

g(f(1,2)) 

f(1,2) für a substituiert ist. Der Operator , der auf a angewendet wurde, verhindert eine Makroerweiterung, so dass das Ergebnis buchstäblich "f(1,2)" lautet.

+0

oh ... ok danke ... ich habe mich nicht auf die Arbeitsweise von # Operator konzentriert – Dhatri

+0

@vindhya Es ist alles eine blutige Sauerei. – Potatoswatter

2

Tun Sie einfach die Ersetzungen.

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

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

Sie sollten auch here sehen.

+0

für die zweitens kann auch g (f (1,2)) g (12) sein und 12 richtig? – Dhatri