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?


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

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.


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.



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).


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.


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 .


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.



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.


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.


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.