Comment puis-je voir un fichier source C / C ++ après le prétraitement dans Visual Studio?

206

Disons que j'ai un fichier source avec de nombreuses directives de préprocesseur. Est-il possible de voir à quoi il ressemble après que le préprocesseur en a fini?

Géo
la source
Il serait utile que vous fournissiez plus d'informations telles que le compilateur que vous utilisez.
JaredPar
J'utilise actuellement Visual Studio 2005 comme mon IDE.
Geo
Ensuite, par défaut, vous utilisez le compilateur cl.exe.
Martin York
3
Pourquoi une réponse gcc a-t-elle été acceptée quand il a dit qu'il utilisait VS2005?
Jim Buck
Connexes: informations sur le compilateur .
Laurie Stearn

Réponses:

147

cl.exe, l'interface de ligne de commande de Microsoft Visual C ++, dispose de trois options différentes pour la sortie du fichier prétraité (d'où l'incohérence dans les réponses précédentes sur Visual C ++):

Si vous souhaitez prétraiter un fichier sans directives #line, combinez les options /Pet /EP.

bk1e
la source
1
Comment passer ces commandes à un projet avec nmake et Makefile?
WooDzu
@WooDzu Utilisez NMAKE (nmake.exe) pour automatiser les tâches qui génèrent des projets Visual C ++ à l'aide d'un makefile traditionnel. ~ msdn.microsoft.com/en-us/library/f35ctcxw.aspx
G.Rassovsky
8
Veuillez noter que /Pcela supprimera la génération des fichiers obj. Donc, si vous mettez des /Poptions, vous risquez d'obtenir un lien indiquant que certains fichiers obj sont introuvables car ils ne sont en fait pas générés du tout.
smwikipedia
Assurez-vous que vous êtes dans VS Developer command promptet NON dans Command promptlorsque vous essayez d'utiliser MS compiler ( cl). Le compilateur n'est pas disponible dans l'invite de commande classique.
dmytro.poliarush
Communauté VS2019: L' erreur / P LNK 1104 est toujours chaude hors de la presse.
Laurie Stearn
119

La plupart des compilateurs ont la possibilité d'exécuter simplement le préprocesseur. par exemple , gcc fournit -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.

Vous pouvez donc simplement exécuter:

gcc -E foo.c

Si vous ne trouvez pas une telle option, vous pouvez également trouver simplement le préprocesseur C sur votre machine. Il est généralement appelé cpp et est probablement déjà sur votre chemin. Invoquez-le comme ceci:

cpp foo.c

S'il y a des en-têtes que vous devez inclure à partir d'autres répertoires, vous pouvez passer -I / path / à / include / dir à l'un ou l'autre, comme vous le feriez avec une compilation régulière.

Pour Windows, je laisserai à d'autres affiches le soin de répondre car je n'y suis pas expert.

Todd Gamblin
la source
2
gcc question: stackoverflow.com/questions/3916979/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
100

Cliquez avec le bouton droit sur le fichier dans l'Explorateur de solutions, accédez à Propriétés. Sous Configuration Properties-> C / C ++ -> Preprocessor, "Generate Preprocessed File" est ce que vous recherchez. Cliquez ensuite avec le bouton droit sur le fichier dans l'Explorateur de solutions et sélectionnez «Compiler». Le fichier prétraité est créé dans le répertoire de sortie (ex: Release, Debug) avec une extension .i (merci à Steed pour son commentaire).

Jim Buck
la source
9
"Prétraiter vers un fichier" dans VS2010.
Rob W
18
BTW, le fichier est créé dans le répertoire de sortie (par exemple Release, Debug) avec une extension .i.
Steed
1
Cela aide beaucoup car il utilise la configuration de construction déjà définie dans le projet pour trouver tous les bons en-têtes.
IanH
Notez que pour moi sur MSVC 2015, le fichier .i n'était pas dans le répertoire de sortie , mais dans le répertoire intermédiaire du projet . Ce ne sont pas les mêmes si par exemple vous générez vos projets en utilisant CMake.
user1556435
19

Vous devez généralement effectuer un post-traitement sur la sortie du préprocesseur, sinon toutes les macros se développent simplement sur une seule ligne, ce qui est difficile à lire et à déboguer. Pour le code C, quelque chose comme ce qui suit suffirait:

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

Pour le code C ++, c'est en fait beaucoup plus difficile. Pour GCC / g ++, j'ai trouvé ce script Perl utile.

ididak
la source
8

Je ne sais rien du compilateur Microsoft, mais sur GCC, vous pouvez utiliser ceci:

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

Si vous voulez voir des commentaires, utilisez ceci:

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

Plus d'options disponibles sur cette page .

dzav
la source
1
Cela fonctionne également avec les compilateurs dérivés de gcc, tels que qcc.exe - merci!
sauge
8

Essayez cl /EPsi vous utilisez le compilateur C ++ de Microsoft.

Atempcode
la source
6

Dans Visual Studio, vous pouvez compiler un fichier (ou projet) avec / P.

Andreas Magnusson
la source
5

Comme bk1e et Andreas M. ont répondu, l'option / P pour le compilateur le fera prétraiter un fichier. Cependant, dans mon projet utilisant VS2005 et Platform Builder (pour un processeur ARM intégré), le projet ne présentait pas d'option dans la boîte de dialogue (comme décrit par Jim B) pour activer cette option.

Je pouvais exécuter CL manuellement et ajouter / P, mais cela a échoué car je ne connaissais pas toutes les options de ligne de commande appropriées qui étaient invisiblement activées par Platform Builder pendant la génération complète. J'avais donc besoin de connaître toutes ces options.

Ma solution était d'aller chercher dans le fichier build.log, et de trouver la ligne exécutée

CL blah-blah-blah myfile.c

J'ai copié cette ligne dans le presse-papiers. La partie "bla-bla-bla" contenait les options de construction et était énorme.

De retour dans l'EDI, j'ai fait un clic droit sur monfichier.c, j'ai choisi "Ouvrir la fenêtre de construction", puis dans cette fenêtre j'ai collé la ligne de commande de construction et ajouté un "/ P".

CL /P blah-blah-blah myfile.c

Terminé. Le fichier myfile.i a été produit, qui contenait la sortie du préprocesseur.

Sam Pittman
la source
2

CPIP est un nouveau préprocesseur C / C ++ écrit en Python. Si vous souhaitez une représentation visuelle détaillée d'un fichier prétraité, essayez-le.

CPIP est un pré-processeur C / C ++ implémenté en Python. La plupart des pré-processeurs considèrent le prétraitement comme un sale boulot qui doit simplement être effectué dès que possible. Cela peut rendre très difficile la recherche de défauts subtils au stade du prétraitement, car les pré-processeurs jettent beaucoup d'informations utiles pour obtenir le résultat le moins cher possible.

Peu de développeurs comprennent vraiment le prétraitement, pour beaucoup, c'est un peu obscur de magie noire. CPIP vise à améliorer cela et en enregistrant chaque détail du prétraitement afin que CPIP puisse produire des informations merveilleusement visuelles sur les dépendances de fichiers, l'utilisation des macros, etc.

CPIP n'est pas conçu pour remplacer cpp (ou tout autre pré-processeur établi), mais CPIP considère la clarté et la compréhension comme plus importantes que la vitesse de traitement.

thegreendroid
la source
2

Sous Windows OS, une réponse simple d'une ligne à cette question consiste à utiliser la commande ci-dessous dans l'invite DOS pour voir le fichier prétraité:

CL /P /C myprogram.c

Cela générera un fichier appelé myprogram.i . Ouvrez-le et recherchez vos préprocesseurs étendus.

mante
la source