2010-04-11 9 views
13

Gibt es eine Möglichkeit, den GCC Präprozessor auszuführen, aber nur für benutzerdefinierte Makros?Führen Sie einen "leichten" Präprozessor für GCC aus

Ich habe ein paar Einzeiler und einige #ifdef usw. Conditionals, und ich möchte sehen, wie mein Code aussieht, wenn nur diese erweitert werden.

Wie es ist, umfasst das erweiterte erhalten, meine fprintf(stderr) s wiederum in fprintf(((__getreeent())->_stderr) usw.

Antwort

14

Anruf cpp direkt, z.B.

$ cat >foo.c <<EOF 
#define FOO 
#ifdef FOO 
foo is defined 
#else 
foo is not defined 
#endif 
EOF 

$ cpp foo.c 
# 1 "foo.c" 
# 1 "<built-in>" 
# 1 "<command-line>" 
# 1 "foo.c" 


foo is defined 

Natürlich, wenn Sie Header hinzufügen, dann werden diese in der Ausgabe enthalten sein. Eine Möglichkeit, dies zu vermeiden, könnte sein, nur grep -v aus den Zeilen mit #include s (oder vielleicht nur mit #include < und ermöglichen #include "). Oder Sie können die Option -nostdinc angeben, um nur Standard-Includes zu entfernen (aber möglicherweise in lokalen Bibliotheken bleiben, wenn Sie Include-Pfade angeben, so dass sie nicht gefunden werden) - dies würde jedoch über fehlende Header warnen.

Edit: Oder verwenden Sie den Präprozessor selbst, um die Einbeziehung von Kopfzeilen bedingten, wickeln Sie sie in etwas wie #ifndef TESTING_PREPROCESSOR und verwenden Sie -DTESTING_PREPROCESSOR.

+2

+1 - Die Spitze für die Umsetzung der '# include' Linien in einer' # if' Abschnitt ist einer dieser einfachen, aber effektiven Dinge, die es könnte jemandem nicht einfallen, bis ein Haufen anderer Bemühungen vergeudet wurde, andere kompliziertere Dinge zu versuchen. –

3
cpp -nostdinc program.c 
1
gcc -E inputfile.c > outputfile.c 

outputfile.c Ihre vorverarbeiteten Code haben, aber alle Makros erweitert werden.

Ich finde diesen Trick sehr nützlich beim Debuggen der Kompilierung von großen Systemen mit Tonnen von Includes, Compiler-Flags und Makefile-Variablen. Es wird Include-Dateien verfügbar machen, die keine Header-Wächter haben, und eine Reihe anderer Probleme.

+1

Ist das nicht die Standardmethode zum Ausführen des Präprozessors? Wie beantwortet das die Frage? Vermutlich möchte das OP ein nicht standardmäßiges Verhalten (?). –

+0

Dies ist der Standardweg. Wenn Ihr Programm umfangreiche benutzerdefinierte Makros verwendet und nicht benutzerdefinierte Makros beleuchtet, sind die benutzerdefinierten Makros leicht zu erkennen. indem Sie ein diff von eingabedatei.c und ausgabedatei.c ausführen. In vielen Fällen ist gcc-E gut genug, obwohl es absolut perfekt ist, "nur" benutzerdefinierte Makros zu erkennen. Und es ist viel schneller als die in anderen Antworten beschriebenen perfekten Methoden. –

2

One-Tools wie unifdef verwenden, unifdefall - entfernen Präprozessor conditionals von Code

Verwandte Themen