Come posso vedere un file sorgente C / C ++ dopo l'elaborazione preliminare in Visual Studio?


206

Diciamo che ho un file sorgente con molte direttive preprocessore. È possibile vedere come appare dopo aver fatto il preprocessore?


Sarebbe utile se fornissi ulteriori informazioni come il compilatore che stai utilizzando.
JaredPar,

Attualmente sto usando Visual Studio 2005 come mio IDE.
Geo,

Quindi, per impostazione predefinita, si utilizza il compilatore cl.exe.
Martin York,

3
Perché una risposta gcc è stata accettata quando ha detto che stava usando VS2005?
Jim Buck,

Risposte:


147

cl.exe, l'interfaccia della riga di comando di Microsoft Visual C ++, ha tre diverse opzioni per l'output del file preelaborato (da cui l'incoerenza nelle risposte precedenti su Visual C ++):

Se si desidera preelaborare un file senza le direttive #line, combinare le opzioni /Pe /EP.


1
Come posso passare questi comandi a un progetto con nmake e Makefile?
WooDzu,

@WooDzu Utilizzare NMAKE (nmake.exe) per automatizzare le attività che creano progetti Visual C ++ utilizzando un makefile tradizionale. ~ Msdn.microsoft.com/en-us/library/f35ctcxw.aspx
G.Rassovsky

8
Si noti che /Psopprimerà la generazione di file obj. Quindi, se si inseriscono /Popzioni, è possibile che venga visualizzato un errore che indica che alcuni file obj non possono essere trovati perché in realtà non vengono generati affatto.
smwikipedia,

Assicurati di essere dentro VS Developer command prompte NON Command promptquando provi a usare il compilatore MS ( cl). Il compilatore non è disponibile nel prompt dei comandi convenzionale.
dmytro.poliarush il

Comunità VS2019: L' errore / P LNK 1104 è ancora caldo dalla stampante.
Laurie Stearn il

119

La maggior parte dei compilatori ha un'opzione per eseguire il preprocessore. ad esempio , gcc fornisce -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.

Quindi puoi semplicemente eseguire:

gcc -E foo.c

Se non riesci a trovare tale opzione, puoi anche trovare il preprocessore C sul tuo computer. Di solito si chiama cpp ed è probabilmente già nel tuo percorso. Invocalo in questo modo:

cpp foo.c

Se ci sono intestazioni che devi includere da altre directory, puoi passare -I / path / a / include / dir a una di queste, proprio come faresti con una normale compilazione.

Per Windows, lo lascerò ad altri poster per fornire risposte in quanto non sono esperto lì.



100

Fare clic con il tasto destro del mouse su Esplora soluzioni, vai a Proprietà. In Proprietà di configurazione-> C / C ++ -> Preprocessore, "Genera file preelaborato" è quello che stai cercando. Quindi fare clic con il tasto destro sul file in Esplora soluzioni e selezionare "Compila". Il file preelaborato viene creato nella directory di output (ad esempio Release, Debug) con un'estensione .i (grazie a Steed per il suo commento).


9
"Preprocessa a un file" in VS2010.
Rob W

18
A proposito, il file viene creato nella directory di output (ad es Release. Debug) Con un'estensione .i.
Steed

1
Questo aiuta molto poiché utilizza la configurazione di build già impostata nel progetto per trovare tutte le intestazioni giuste.
IanH,

Nota, per me su MSVC 2015, il file .i non era nella directory di output , ma nella directory intermedia del progetto . Questi non sono gli stessi se, ad esempio, generate i vostri progetti usando CMake.
user1556435

19

In genere è necessario eseguire un po 'di postelaborazione sull'output del preprocessore, altrimenti tutte le macro si espandono in una sola riga, che è difficile da leggere ed eseguire il debug. Per il codice C, sarebbe sufficiente qualcosa di simile al seguente:

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

Per il codice C ++, in realtà è molto più difficile. Per GCC / g ++, ho trovato utile questo script Perl .


8

Non so nulla del compilatore Microsoft, ma su GCC puoi usare questo:

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

Se vuoi vedere i commenti usa questo:

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

Altre opzioni disponibili in questa pagina .


1
Questo funziona anche con compilatori derivati ​​da gcc, come qcc.exe - grazie!
salvia

8

Prova cl /EPse stai utilizzando il compilatore C ++ di Microsoft.



5

Quando bk1e e Andreas M. hanno risposto, l'opzione / P per il compilatore lo farà preelaborare un file. Tuttavia, nel mio progetto utilizzando VS2005 e Platform Builder (per un processore ARM incorporato), il progetto non ha presentato un'opzione nella finestra di dialogo (come descritto da Jim B) per abilitare tale opzione.

Potrei eseguire CL manualmente e aggiungere / P, ma non è riuscito perché non conoscevo tutte le opzioni appropriate della riga di comando che erano state invisibilmente attivate da Platform Builder durante la compilazione completa. Quindi avevo bisogno di sapere tutte quelle opzioni.

La mia soluzione era quella di andare a cercare nel file build.log e trovare la riga che veniva eseguita

CL blah-blah-blah myfile.c

Ho copiato questa riga negli appunti. La parte "blah-blah-blah" conteneva le opzioni di costruzione ed era enorme.

Di nuovo nell'IDE, ho fatto clic con il pulsante destro del mouse su myfile.c, ho scelto "Apri finestra di build", quindi in quella finestra ho incollato la riga di comando di build e ho aggiunto un "/ P".

CL /P blah-blah-blah myfile.c

Fatto. È stato prodotto il file myfile.i, che conteneva l'output del preprocessore.


2

CPIP è un nuovo preprocessore C / C ++ scritto in Python. Se si desidera una rappresentazione visiva dettagliata di un file preelaborato, provare.

CPIP è un pre-processore C / C ++ implementato in Python. La maggior parte dei pre-processori considera la pre-elaborazione come un lavoro sporco che deve essere fatto appena possibile. Ciò può rendere molto difficile rintracciare i sottili difetti nella fase di pre-elaborazione poiché i pre-processori scaricano molte informazioni utili a favore di ottenere il risultato nel modo più economico possibile.

Pochi sviluppatori capiscono davvero la pre-elaborazione, per molti è un po 'oscura di magia nera. CPIP mira a migliorarlo e registrando ogni dettaglio della preelaborazione in modo che CPIP possa produrre meravigliosamente informazioni visive sulle dipendenze dei file, sull'utilizzo delle macro e così via.

CPIP non è progettato per essere un sostituto di cpp (o di qualsiasi altro pre-processore stabilito), invece CPIP considera la chiarezza e la comprensione più importanti della velocità di elaborazione.


2

Sul sistema operativo Windows, una semplice risposta di una riga a questa domanda è utilizzare il comando seguente nel prompt di DOS per visualizzare il file preelaborato:

CL /P /C myprogram.c

Questo genererà un file chiamato myprogram.i . Aprilo e cerca i tuoi preprocessori espansi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.