Führen Sie einen “leichten” Präprozessor für GCC aus

Lesezeit: 2 Minuten

Benutzer-Avatar
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.

Benutzer-Avatar
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.

1054160cookie-checkFühren Sie einen “leichten” Präprozessor für GCC aus

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy