Peut gcc sortie de code C après prétraitement?
Je suis en utilisant une bibliothèque open source qui semble avoir beaucoup de prétraitement des directives à l'appui de nombreuses langues autres que C. Afin que je puisse étudier ce que la bibliothèque est en train de faire, j'aimerais voir le code C que je suis la compilation après prétraitement, de plus comme ce que j'avais à écrire.
Peut gcc (ou tout autre outil couramment disponibles sous Linux) lire cette bibliothèque, mais la sortie C du code qui a le prétraitement converti à quoi que ce soit et est également lisible par un humain?
- La séquence de code n'aurez pas toutes les directives de préprocesseur plus mais je suis assez sûr que ce sera beaucoup beaucoup moins lisible qu'avant d'être prétraitées...
- Cela dépend de la façon horriblement les gens de l'écriture du code abusé du préprocesseur.
- Envisagez de changer votre réponse ici.
gcc -E
est plus utile que d'avoir à réécrire la ligne de la faire fonctionner aveccpp
.
Vous devez vous connecter pour publier un commentaire.
Oui. Passer de gcc le
-E
option. Cela permettra de sortie de séquence de code source.-o something.o
vous pouvez également modifier à-o something.i
. Sinon, la séquence de sortie sera dans le.o
fichier.cpp
est le préprocesseur.Exécuter
cpp filename.c
à la sortie de la séquence de code, ou mieux, de le rediriger vers un fichier aveccpp filename.c > filename.preprocessed
.diff
tourne pas de différence dans les fichiers. C'est aussi ressemble à un moyen utile pour prétraiter le code à la recherche d'erreurs dans vos macros. Excellente question et une grande réponse (IALCTHW).Je suis en utilisant gcc comme un préprocesseur (pour les fichiers html.) Il fait simplement ce que vous voulez. Il se développe "# -- des" directives", puis génère un fichier lisible. (AUCUN des autres C/HTML préprocesseurs j'ai essayé de le faire - ils concaténer des lignes, de s'étouffer avec des caractères spéciaux, etc.) Considère que vous avez gcc installé, la ligne de commande est:
gcc-E -x c -P -C -traditionnelle-rpc code_before.cpp > code_after.cpp
(N'a pas à être 'rpc'.) Il y a une excellente description de cette utilisation, à http://www.cs.tut.fi/~jkorpela/html/cpre.html.
Le "traditionnel-rpc" conserve les espaces & onglets.
Exécuter:
ou
-save-temps
C'est une autre bonne option pour avoir à l'esprit:
principal.c
et maintenant, en plus de la sortie normal
main.o
, le répertoire de travail actuel contient également les fichiers suivants:main.i
est de prepossessed fichier contenant:main.s
est un bonus 🙂 et contient l'assembly généré:Si vous voulez le faire pour un grand nombre de fichiers, pensez à utiliser à la place:
qui enregistre les fichiers intermédiaires pour le même répertoire que le
-o
sortie de l'objet au lieu de le répertoire de travail courant, évitant ainsi d'éventuels basename conflits.L'avantage de cette option sur
-E
est qu'il est facile de l'ajouter à un script de construction, sans interférer beaucoup dans la construction elle-même.Une autre chose cool à propos de cette option est que si vous ajoutez
-v
:il fait montre de manière explicite de fichiers utilisé à la place de vilain temporaires en vertu de l'
/tmp
, de sorte qu'il est facile de savoir exactement ce qui se passe, ce qui inclut le prétraitement /compilation /étapes d'assemblage:Testé sous Ubuntu 19.04 amd64, GCC 8.3.0.
Supposons que nous avons un fichier que Message.cpp ou une .c fichier
Les Étapes 1: De Prétraitement (Argument -E )
g++ -E .\Message.cpp > P1
P1 fichier généré a élargi les macros et le fichier d'en-tête contenu et les commentaires sont supprimés.
Étape 2: Traduire Prétraitées fichier à l'assemblée (Argument -S). Cette tâche est effectuée par le compilateur
g++ -S .\Message.cpp
Un assembleur (ASM) est généré (le Message.s). Il a tout le code assembleur.
Étape 3: Traduire assemblée de code de code de l'Objet. Remarque: Le Message.s a été généré à l'Étape 2.
g++ -c .\Message.s
Un fichier Objet avec le nom de Message.o est généré. Il est de la forme binaire.
Étape 4: Reliant le fichier de l'objet. Cette tâche est effectuée par l'éditeur de liens
g++ .\Message.o-o MessageApp
Un fichier exe MessageApp.exe est produit ici.