Estoy usando una biblioteca de código abierto que parece tener muchas directivas de preprocesamiento para admitir muchos lenguajes además de C. Para poder estudiar lo que está haciendo la biblioteca, me gustaría ver el código C que estoy compilando después del preprocesamiento. , más como lo que escribiría.
¿Puede gcc (o cualquier otra herramienta comúnmente disponible en Linux) leer esta biblioteca pero generar un código C que tiene el preprocesamiento convertido a lo que sea y que también sea legible por un humano?
gcc -E
es más útil que tener que reescribir la línea para que funcionecpp
.Respuestas:
Si. Pase gcc la
-E
opción. Esto generará código fuente preprocesado.fuente
-o something.o
es posible que también desee cambiarlo-o something.i
. De lo contrario, la salida preprocesada estará en el.o
archivo.gcc -E file1.c file2.c ...
cpp
es el preprocesador.Ejecutar
cpp filename.c
para generar el código preprocesado, o mejor, redirigirlo a un archivo concpp filename.c > filename.preprocessed
.fuente
diff
no muestra ninguna diferencia en los archivos. Esta también parece una forma útil de preprocesar el código en busca de errores en sus macros. Gran pregunta y gran respuesta (IALCTHW).Estoy usando gcc como preprocesador (para archivos html). Hace exactamente lo que quieres. Expande las directivas "# -" y luego genera un archivo legible. (NINGUNO de los otros preprocesadores C / HTML que he intentado hacer esto: concatenan líneas, se ahogan con caracteres especiales, etc.) Suponiendo que tiene instalado gcc, la línea de comando es:
gcc -E -xc -P -C -traditional-cpp code_before.cpp> code_after.cpp
(No tiene que ser 'cpp'). Hay una excelente descripción de este uso en http://www.cs.tut.fi/~jkorpela/html/cpre.html .
El "-traditional-cpp" conserva los espacios en blanco y las pestañas.
fuente
-save-temps
Esta es otra buena opción a tener en cuenta:
C Principal
y ahora, además de la salida normal
main.o
, el directorio de trabajo actual también contiene los siguientes archivos:main.i
es el archivo predilecto deseado que contiene:main.s
es un bono :-) y contiene el ensamblado generado:Si desea hacerlo para una gran cantidad de archivos, considere usar en su lugar:
que guarda los archivos intermedios en el mismo directorio que la
-o
salida del objeto en lugar del directorio de trabajo actual, evitando así posibles conflictos de nombres de base.La ventaja de esta opción
-E
es que es fácil agregarla a cualquier script de compilación, sin interferir mucho en la compilación en sí.Otra cosa interesante de esta opción es si agrega
-v
:en realidad, muestra los archivos explícitos que se utilizan en lugar de los feos temporales
/tmp
, por lo que es fácil saber exactamente qué está sucediendo, lo que incluye los pasos de preprocesamiento / compilación / ensamblaje:Probado en Ubuntu 19.04 amd64, GCC 8.3.0.
fuente
Correr:
o
fuente
Supongamos que tenemos un archivo como Message.cpp o un archivo .c
Pasos 1: preprocesamiento (argumento -E)
g ++ -E. \ Message.cpp> P1
El archivo P1 generado tiene macros expandidas y el contenido del archivo de encabezado y los comentarios se eliminan.
Paso 2: Traducir el archivo preprocesado a ensamblado (Argumento -S). Esta tarea la realiza el compilador
g ++ -S. \ Message.cpp
Se genera un ensamblador (ASM) (Message.s). Tiene todo el código ensamblador.
Paso 3: Traducir el código ensamblador al código del objeto. Nota: Message.s se generó en Step2. g ++ -c. \ Message.s
Se genera un archivo de objeto con el nombre Message.o. Es la forma binaria.
Paso 4: vincular el archivo de objeto. Esta tarea la realiza el enlazador
g ++. \ Message.o -o MessageApp
Aquí se genera un archivo exe MessageApp.exe.
fuente