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?
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?
Réponses:
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 ++):
/E
: prétraiter vers stdout (similaire à l'option -E de GCC)/P
: prétraiter vers un fichier/EP
: préprocess pour stdout sans directives #lineSi vous souhaitez prétraiter un fichier sans directives #line, combinez les options /P
et /EP
.
/P
cela supprimera la génération des fichiers obj. Donc, si vous mettez des /P
options, 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.
VS Developer command prompt
et NON dans Command prompt
lorsque vous essayez d'utiliser MS compiler ( cl
). Le compilateur n'est pas disponible dans l'invite de commande classique.
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.
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).
Release
, Debug
) avec une extension .i
.
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.
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 .
Dans Visual Studio, vous pouvez compiler un fichier (ou projet) avec / P.
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.
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.