Führen Sie einen “leichten” Präprozessor für GCC aus
Lesezeit: 2 Minuten
Claudius
Gibt es eine Möglichkeit, das auszuführen GCC Präprozessor, aber nur für benutzerdefinierte Makros?
Ich habe ein paar Einzeiler und einige #ifdefusw. Bedingungen, und ich möchte sehen, wie mein Code aussieht, wenn nur diese erweitert werden.
So wie es ist, werden die Includes erweitert, my fprintf(stderr)s verwandeln sich in fprintf(((__getreeent())->_stderr)etc.
Arkku
Anruf cpp direkt, z
$ 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
Wenn Sie Header einfügen, werden diese natürlich in die Ausgabe aufgenommen. Eine Möglichkeit, dies zu vermeiden, könnte darin bestehen, einfach zu sein grep -v aus den Linien mit #includes (oder vielleicht nur solche mit #include < und erlauben #include "). Oder Sie könnten die angeben -nostdinc Option, um nur Standard-Includes zu entfernen (aber möglicherweise in lokalen Bibliotheken belassen, es sei denn, Sie geben Include-Pfade an, damit sie nicht gefunden werden) – dies würde jedoch vor fehlenden Headern warnen.
Bearbeiten: Oder verwenden Sie den Präprozessor selbst, um die Einbeziehung von Headern bedingt zu machen, wickeln Sie sie in etwas wie ein #ifndef TESTING_PREPROCESSOR und verwenden -DTESTING_PREPROCESSOR.
+1 – Der Tipp zum Setzen der #include Linien in einem #if Abschnitt ist eines dieser einfachen, aber effektiven Dinge, die jemandem vielleicht nicht einfallen, bis ein Haufen anderer Bemühungen verschwendet wurde, um andere kompliziertere Dinge zu versuchen.
– Michael Burr
11. April 2010 um 4:56 Uhr
cpp -nostdinc program.c
Man kann Tools wie unifdef, unifdefall verwenden – Präprozessorbedingungen aus dem Code entfernen
gcc -E inputfile.c > outputfile.c
outputfile.c enthält Ihren vorverarbeiteten Code, aber alle Makros werden erweitert.
Ich finde diesen Trick sehr nützlich beim Debuggen der Kompilierung großer Systeme mit Tonnen von Includes, Compiler-Flags und Makefile-Variablen. Es wird Include-Dateien aufdecken, die keine Header-Wächter haben, und auch eine Reihe anderer Probleme.
Wenn Sie nur Makroerweiterungen wünschen und die #include Handhabung, können Sie dies versuchen Repo. Es ist eine Gabel des Originals pcpp. Ich habe ein hinzugefügt --no-include Option zum Überspringen der Behandlung von #include Richtlinie. Alle anderen Makros werden basierend auf Ihrer Marco-Eingabe verarbeitet pcpp.
10541600cookie-checkFühren Sie einen “leichten” Präprozessor für GCC ausyes