J'utilise une bibliothèque open source qui semble avoir beaucoup de directives de prétraitement pour prendre en charge de nombreux langages autres que C.Pour que je puisse étudier ce que fait la bibliothèque, j'aimerais voir le code C que je compile après le prétraitement , plus comme ce que j'écrirais.
Est-ce que gcc (ou tout autre outil couramment disponible sous Linux) peut lire cette bibliothèque mais générer du code C dont le prétraitement est converti en n'importe quoi et qui est également lisible par un humain?
gcc -E
est plus utile que d'avoir à réécrire la ligne pour la faire fonctionnercpp
.Réponses:
Oui. Passez l'
-E
option gcc . Cela produira un code source prétraité.la source
-o something.o
vous pouvez également le changer en-o something.i
. Sinon, la sortie prétraitée sera dans le.o
fichier.gcc -E file1.c file2.c ...
cpp
est le préprocesseur.Exécutez
cpp filename.c
pour sortir le code prétraité, ou mieux, redirigez-le vers un fichier aveccpp filename.c > filename.preprocessed
.la source
diff
ne révèle aucune différence dans les fichiers. Cela ressemble également à un moyen utile de prétraiter le code à la recherche d'erreurs dans vos macros. Excellente question et excellente réponse (IALCTHW).J'utilise gcc comme préprocesseur (pour les fichiers html.) Il fait exactement ce que vous voulez. Il développe les directives "# -", puis génère un fichier lisible. (AUCUN des autres préprocesseurs C / HTML que j'ai essayés ne le font - ils concaténent des lignes, s'étouffent avec des caractères spéciaux, etc.) En supposant que gcc soit installé, la ligne de commande est:
gcc -E -xc -P -C -traditional-cpp code_before.cpp> code_after.cpp
(N'a pas besoin d'être «cpp».) Il y a une excellente description de cette utilisation à http://www.cs.tut.fi/~jkorpela/html/cpre.html .
Le "-traditional-cpp" préserve les espaces et les tabulations.
la source
-save-temps
Voici une autre bonne option à garder à l'esprit:
principal c
et maintenant, en plus de la sortie normale
main.o
, le répertoire de travail actuel contient également les fichiers suivants:main.i
est le fichier préposés souhaité contenant:main.s
est un bonus :-) et contient l'assemblage généré:Si vous souhaitez le faire pour un grand nombre de fichiers, envisagez d'utiliser à la place:
qui enregistre les fichiers intermédiaires dans le même répertoire que la
-o
sortie de l' objet au lieu du répertoire de travail courant, évitant ainsi les conflits de nom de base potentiels.L'avantage de cette option
-E
est qu'il est facile de l'ajouter à n'importe quel script de construction, sans trop interférer dans la construction elle-même.Une autre chose intéressante à propos de cette option est si vous ajoutez
-v
:il montre en fait les fichiers explicites utilisés au lieu des horribles temporaires sous
/tmp
, il est donc facile de savoir exactement ce qui se passe, ce qui inclut les étapes de prétraitement / compilation / assemblage:Testé dans Ubuntu 19.04 amd64, GCC 8.3.0.
la source
Courir:
ou
la source
Supposons que nous ayons un fichier comme Message.cpp ou un fichier .c
Étapes 1: prétraitement (argument -E)
g ++ -E. \ Message.cpp> P1
Le fichier P1 généré a des macros développées et le contenu du fichier d'en-tête et les commentaires sont supprimés.
Étape 2: Traduire le fichier prétraité en assembly (Argument -S). Cette tâche est effectuée par le compilateur
g ++ -S. \ Message.cpp
Un assembleur (ASM) est généré (Message.s). Il a tout le code d'assemblage.
Étape 3: Traduire le code d'assembly en code objet. Remarque: Message.s a été généré à l'étape 2. g ++ -c. \ Message.s
Un fichier objet avec le nom Message.o est généré. C'est la forme binaire.
Étape 4: Lier le fichier objet. Cette tâche est effectuée par l'éditeur de liens
g ++. \ Message.o -o MessageApp
Un fichier exe MessageApp.exe est généré ici.
la source