2012-11-26 11 views
6

Ich habe ein Problem mit dem Verständnis der Verwendung von Makrofunktionsaufrufen aus einer printf() -Anweisung.Makrofunktionsaufruf in printf-Anweisung in C

Ich habe den Code unten:

#include<stdio.h> 
#define f(g,h) g##h 
main() 
{ 
    printf("%d",f(100,10)); 
} 

Dieser Code gibt "10010" als Antwort.

Ich habe gelernt, dass Makro Funktionsaufruf einfach kopieren den Makro Funktionscode anstelle des Aufrufs mit den Argumenten ersetzt. So sollte der Code

wie:

#include<stdio.h> 
#define f(g,h) g##h 
main() 
{ 
    printf("%d",100##10); 
} 

Aber wenn ich den obigen Code separat mit substituierten Makro ausgeführt, erhalte ich einen Übersetzungsfehler.

Also, wie gibt der erste Code 10010 als die Antwort, während der zweite Code einen Kompilierungsfehler gibt?

+2

## ist nur innerhalb Ihrer #define-Anweisung gültig und hat keine Auswirkungen, es sei denn, die Zeile beginnt mit '#define [your stuff here]', da die '#define' den Compiler anweist, diesen Teil zu behandeln Code speziell. – ActiveTrayPrntrTagDataStrDrvr

+0

Das '##' stellt sicher, dass die Parameter verkettet sind. Daher: f (100,10) wird durch den Präprozessor ersetzt in: 10010 – Tomas

Antwort

15

Der Preprozessor-Verkettungsoperator ## ist fertig vor das Makro ist ersetzt. Es kann nur in Makrokörpern verwendet werden.

+0

Perfect. Das erklärt, warum der zweite Code nicht funktioniert hat. Vielen Dank –

1

Der Operator ## hat spezielle Bedeutung für Präprozessor, es ist ein Token-Paste-Operator, der zwei Token zusammen "klebt". Also in Ihrem Fall, g und h sind 'zusammengeklebt', was zu neuen Token - Int Literal 10010.

1

Es gibt einige Sonderzeichen wie ## in einem Makro, die die Regel ändern "ersetzt einfach Text".