Wie sehe ich eine C / C ++ - Quelldatei nach der Vorverarbeitung in Visual Studio?

204

Angenommen, ich habe eine Quelldatei mit vielen Präprozessoranweisungen. Ist es möglich zu sehen, wie es aussieht, nachdem der Präprozessor damit fertig ist?

Geo
quelle
Es wäre hilfreich, wenn Sie weitere Informationen angeben würden, z. B. welchen Compiler Sie verwenden.
JaredPar
Ich verwende derzeit Visual Studio 2005 als meine IDE.
Geo
Dann verwenden Sie standardmäßig den Compiler cl.exe.
Martin York
3
Warum wurde eine gcc-Antwort akzeptiert, als er sagte, dass er VS2005 verwendet?
Jim Buck
Verwandte: Compiler-Informationen .
Laurie Stearn

Antworten:

146

cl.exeDie Befehlszeilenschnittstelle zu Microsoft Visual C ++ bietet drei verschiedene Optionen für die Ausgabe der vorverarbeiteten Datei (daher die Inkonsistenz in den vorherigen Antworten zu Visual C ++):

Wenn Sie eine Datei ohne # line-Direktiven vorverarbeiten möchten, kombinieren Sie die Optionen /Pund /EP.

bk1e
quelle
1
Wie übergebe ich diese Befehle an ein Projekt mit nmake und Makefile?
WooDzu
@WooDzu Verwenden Sie NMAKE (nmake.exe), um Aufgaben zu automatisieren, die Visual C ++ - Projekte mithilfe eines herkömmlichen Makefiles erstellen. ~ msdn.microsoft.com/en-us/library/f35ctcxw.aspx
G.Rassovsky
7
Bitte beachten Sie, dass dadurch /Pdie Erzeugung von obj-Dateien unterdrückt wird. Wenn Sie also /POptionen eingeben, wird möglicherweise ein Link-Fehler angezeigt, der besagt, dass einige obj-Dateien nicht gefunden werden können, da sie tatsächlich überhaupt nicht generiert werden.
Smwikipedia
Stellen Sie sicher, dass Sie sich in VS Developer command promptund NICHT in befinden, Command promptwenn Sie versuchen, MS compiler ( cl) zu verwenden. Der Compiler ist in der herkömmlichen Eingabeaufforderung nicht verfügbar.
dmytro.poliarush
VS2019 Community: Der Fehler / P LNK 1104 ist immer noch druckfrisch .
Laurie Stearn
119

Die meisten Compiler haben die Möglichkeit, nur den Präprozessor auszuführen. zB liefert gcc -E:

   -E  Stop after the preprocessing stage; do not run the compiler proper.  
       The output is in the form of preprocessed source code, which is sent
       to the standard output.

Sie können also einfach ausführen:

gcc -E foo.c

Wenn Sie eine solche Option nicht finden, finden Sie auch nur den C-Präprozessor auf Ihrem Computer. Es heißt normalerweise cpp und ist wahrscheinlich schon auf deinem Weg. Rufen Sie es so auf:

cpp foo.c

Wenn Sie Header aus anderen Verzeichnissen einfügen müssen, können Sie -I / path / to / include / dir an eines dieser Verzeichnisse übergeben, genau wie bei einer regulären Kompilierung.

Für Windows überlasse ich es anderen Postern, Antworten zu geben, da ich dort kein Experte bin.

Todd Gamblin
quelle
2
gcc Frage: stackoverflow.com/questions/3916979/…
Ciro Santilli 17 冠状 病 六四 事件 法轮功
98

Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf die Datei und gehen Sie zu Eigenschaften. Unter Konfigurationseigenschaften-> C / C ++ -> Präprozessor suchen Sie nach "Vorverarbeitete Datei generieren". Klicken Sie dann im Projektmappen-Explorer mit der rechten Maustaste auf die Datei und wählen Sie "Kompilieren". Die vorverarbeitete Datei wird im Ausgabeverzeichnis (z. B. Release, Debug) mit der Erweiterung .i erstellt (danke an Steed für seinen Kommentar).

Jim Buck
quelle
9
"Vorverarbeitung zu einer Datei" in VS2010.
Rob W
18
BTW, wird die Datei im Ausgabeverzeichnis erstellt (zB Release, Debug) mit einer Verlängerung .i.
Steed
1
Dies ist sehr hilfreich, da die bereits im Projekt eingerichtete Build-Konfiguration verwendet wird, um die richtigen Header zu finden.
IanH
Beachten Sie , für mich auf MSVC 2015 war die .i - Datei nicht im Ausgabeverzeichnis , sondern in dem Projektzwischenverzeichnis . Dies ist nicht dasselbe, wenn Sie z. B. Ihre Projekte mit CMake generieren.
user1556435
19

In der Regel müssen Sie die Ausgabe des Präprozessors nachbearbeiten. Andernfalls werden alle Makros nur zu einem Liner erweitert, was schwer zu lesen und zu debuggen ist. Für C-Code würde etwa Folgendes ausreichen:

gcc -E code.c | sed '/^\#/d' | indent -st -i2 > code-x.c

Für C ++ - Code ist es tatsächlich viel schwieriger. Für GCC / g ++ fand ich dieses Perl-Skript nützlich.

ididak
quelle
8

Ich weiß nichts über Microsoft Compiler, aber auf GCC können Sie dies verwenden:

gcc -E -P -o result.c my_file.h

Wenn Sie Kommentare sehen möchten, verwenden Sie diese:

gcc -E -C -P -o result.c my_file.h

Weitere Optionen finden Sie auf dieser Seite .

dzav
quelle
1
Dies funktioniert auch mit von gcc abgeleiteten Compilern wie qcc.exe - danke!
Salbei
8

Versuchen Sie, cl /EPwenn Sie den C ++ - Compiler von Microsoft verwenden.

Atempcode
quelle
6

In Visual Studio können Sie eine Datei (oder ein Projekt) mit / P kompilieren.

Andreas Magnusson
quelle
5

Wie bk1e und Andreas M. geantwortet haben, bewirkt die Option / P für den Compiler, dass eine Datei vorverarbeitet wird. In meinem Projekt mit VS2005 und Platform Builder (für einen eingebetteten ARM-Prozessor) wurde im Dialogfeld (wie von Jim B beschrieben) keine Option zum Aktivieren dieser Option angezeigt.

Ich konnte CL manuell ausführen und / P hinzufügen, aber es schlug fehl, weil ich nicht alle geeigneten Befehlszeilenoptionen kannte, die von Platform Builder während des vollständigen Builds unsichtbar aktiviert wurden. Also musste ich all diese Optionen kennen.

Meine Lösung bestand darin, in der Datei build.log nach der ausgeführten Zeile zu suchen

CL blah-blah-blah myfile.c

Ich habe diese Zeile in die Zwischenablage kopiert. Der Teil "bla-bla-bla" enthielt die Build-Optionen und war riesig.

Zurück in der IDE habe ich mit der rechten Maustaste auf myfile.c geklickt, "Build-Fenster öffnen" ausgewählt und dann in diesem Fenster die Build-Befehlszeile eingefügt und ein "/ P" hinzugefügt.

CL /P blah-blah-blah myfile.c

Getan. Die Datei myfile.i wurde erstellt, die die Präprozessorausgabe enthielt.

Sam Pittman
quelle
2

CPIP ist ein neuer C / C ++ - Präprozessor, der in Python geschrieben wurde. Wenn Sie eine detaillierte visuelle Darstellung einer vorverarbeiteten Datei wünschen, probieren Sie sie aus.

CPIP ist ein in Python implementierter C / C ++ - Vorprozessor. Die meisten Vorverarbeiter betrachten die Vorverarbeitung als schmutzigen Job, der nur so schnell wie möglich erledigt werden muss. Dies kann es sehr schwierig machen, subtile Fehler in der Vorverarbeitungsphase aufzuspüren, da Vorverarbeiter viele nützliche Informationen wegwerfen, um das Ergebnis so billig wie möglich zu erhalten.

Nur wenige Entwickler verstehen die Vorverarbeitung wirklich, für viele ist es ein obskures Stück schwarzer Magie. CPIP zielt darauf ab, dies zu verbessern, und indem jedes Detail der Vorverarbeitung aufgezeichnet wird, damit CPIP einige wunderbar visuelle Informationen über Dateiabhängigkeiten, Makronutzung usw. erzeugen kann.

CPIP ist nicht als Ersatz für cpp (oder einen anderen etablierten Vorprozessor) konzipiert, sondern CPIP betrachtet Klarheit und Verständnis als wichtiger als die Verarbeitungsgeschwindigkeit.

thegreendroid
quelle
2

Unter Windows besteht eine einfache einzeilige Antwort auf diese Frage darin, den folgenden Befehl in der DOS-Eingabeaufforderung zu verwenden, um die vorverarbeitete Datei anzuzeigen:

CL /P /C myprogram.c

Dadurch wird eine Datei mit dem Namen myprogram.i generiert . Öffnen Sie es und achten Sie auf Ihre erweiterten Präprozessoren.

Manty
quelle