2016-08-08 16 views
0

Ich folgte nur ein Tutorial, das CPP-Makros zu implementieren, um ein Debug-System in einem Programm zu implementieren. Ein großes Verhalten der Makros wird rekursiv, so dass es möglich, ein Makro in einem anderen Makro zu setzen wie unten:C-Pre-Prozessor Makros Auftrag

#define MACRO1 "World" 
#define MACRO2 printf("Hello %s\n",MACRO1); 
#include<stdio.h> 
#include<stdlib.h> 

int main(int argc, char *argv[]){ 
    MACRO2 
    return 0; 
} 

Ausgang: Hello World

Die unten scheint auch zu funktionieren:

#define MACRO2 printf("Hello %s\n",MACRO1); 
#define MACRO1 "World" 
#include<stdio.h> 
#include<stdlib.h> 

int main(int argc, char *argv[]){ 
    MACRO2 
    return 0; 
} 

Also nur zu verstehen, liest CPP zuerst alle #define X, um eine Liste der deklarierten Makros zu machen, um dann die Makros, die in anderen Makros sind, zu ersetzen, Vermeidung der "Huhn und Ei" Problem auf der Vorverarbeitung?

Ich denke, das macht Sinn, wenn man bedenkt, dass die Vorverarbeitung ein einmaliger Prozess ist (während der Kompilierung), der nicht in Echtzeit stattfindet. Es sollte also nicht darauf ankommen, wo im Code ein Makro definiert wurde, sondern ob es überhaupt definiert wurde.

Haben Sie einen Code mit 3000 Zeilen und nur in der letzten Zeile, die ein im Code verwendetes Makro definiert, wäre dann gültig?

Vielen Dank im Voraus!

+0

Mögliches Duplikat von [Wie viele Durchläufe macht der C-Präprozessor?] (Http://stackoverflow.com/questions/13442028/how-many-passes-does-the-c-preprocessor-make) –

Antwort

1

Tatsächlich passiert die rekursive Ersetzung nur, wenn ein Makro verwendet wird, nicht wenn es definiert ist.

So bei

#define MACRO2 printf("Hello %s\n",MACRO1); 

der Präprozessor merkt nur, dass MACRO2 erweitert, wie die 7-Token printf, (, "Hello %s\n", ,, MACRO1, ) und ;. An diesem Punkt ist es egal, ob einige dieser Token Makros sind.

An dem Punkt, in main wo Sie

MACRO2 

der Präprozessor erweitert das Makro zu diesen sieben Token tun, und dann überprüft, ob der Token-Stream keine weiteren Makros enthält, die wieder erweitert werden kann. Es bemerkt MACRO1 und ersetzt das Token "World". An dieser Stelle wird erneut geprüft, aber es gibt keine weiteren Makros für die Erweiterung.

Sie werden immer noch Probleme haben, wenn Sie versuchen, ein Makro zu verwenden, bevor es #define d war.