2008-11-10 10 views
185

Digamos que tengo un archivo fuente con muchas directivas de preprocesador. ¿Es posible ver cómo se ve después de que el preprocesador haya terminado?¿Cómo veo un archivo fuente C/C++ después del preprocesamiento en Visual Studio?

+0

Ayudaría si proporcionó más información, como qué compilador está utilizando. – JaredPar

+0

Actualmente estoy usando Visual Studio 2005 como mi IDE. – Geo

+0

Entonces de forma predeterminada está utilizando el compilador cl.exe. –

Respuesta

134

cl.exe, la interfaz de línea de comandos para Microsoft Visual C++, tiene tres opciones diferentes para dar salida al archivo preprocesado (de ahí la falta de coherencia en las respuestas anteriores acerca de Visual C++):

Si desea preprocesar un archivo sin directivas #line, combine las opciones /P y /EP.

+1

¿Cómo paso estos comandos a un proyecto con nmake y Makefile? – WooDzu

+0

@WooDzu Utilice NMAKE (nmake.exe) para automatizar tareas que crean proyectos de Visual C++ utilizando un archivo MAKE tradicional. ~ https://msdn.microsoft.com/en-us/library/f35ctcxw.aspx –

+2

Tenga en cuenta que '/ P' suprimirá la generación de archivos obj. Entonces, si pones las opciones '/ P', puedes obtener un error en el enlace diciendo que algunos archivos obj no se pueden encontrar porque en realidad no se generan en absoluto. – smwikipedia

119

La mayoría de los compiladores tienen la opción de ejecutar el preprocesador. p., GCC proporciona -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. 

lo que sólo puede funcionar:

gcc -E foo.c 

Si no puede encontrar una opción, también puede simplemente encontrar el preprocesador de C en su máquina. Por lo general, se llama cpp y probablemente ya esté en su camino. Invocarlo como esto:

cpp foo.c 

Si hay encabezados que necesita para incluir a otros directorios, puede pasar -I/ruta/a/include/dir a cualquiera de éstos, tal como lo haría con una compilación periódica .

Para Windows, dejaré que otros carteles me proporcionen respuestas ya que no soy un experto allí.

+0

pregunta de gcc: http: // stackoverflow.com/questions/3916979/how-to-run-the-gcc-preprocessor-to-see-how-the-source-looks-after-define-are-e –

6

En Visual Studio puede compilar un archivo (o proyecto) con/P.

8

Pruebe cl /EP si está utilizando el compilador de C++ de Microsoft.

89

Haga clic derecho en el archivo en el Explorador de soluciones, vaya a Propiedades. En Propiedades de configuración-> C/C++ -> Preprocesador, "Generar archivo preprocesado" es lo que está buscando. A continuación, haga clic derecho en el archivo en el Explorador de soluciones y seleccione "Compilar". El archivo preprocesado se crea en el directorio de salida (por ejemplo, Release, Debug) con una extensión .i (gracias a Steed por su comentario).

+9

"Preprocesamiento de un archivo" en VS2010. –

+17

BTW, el archivo se crea en el directorio de salida (por ejemplo, 'Release',' Debug') con una extensión '.i'. – Steed

+0

+1 respuesta más directa. –

18

Por lo general, es necesario realizar algunos procesos posteriores en la salida del preprocesador; de lo contrario, todas las macros se expanden a uno solo, lo cual es difícil de leer y depurar. Para el código C, algo como el siguiente sería suficiente:

gcc -E code.c | sed '/^\#/d' | indent -st -i2 > code-x.c 

Para el código C++, en realidad es mucho más difícil. Para GCC/g ++, encontré this Perl script útil.

+0

¡Muchas gracias! – malat

+0

esto es impresionante – iceman

5

Como bk1e y Andreas M. respondieron, la opción/P para el compilador provocará que preprocesa un archivo. Sin embargo, en mi proyecto utilizando VS2005 y Platform Builder (para un procesador ARM incrustado), el proyecto no presentó una opción en el cuadro de diálogo (como lo describe Jim B) para habilitar esa opción.

Pude ejecutar CL manualmente y agregar/P, pero falló porque no sabía todas las opciones apropiadas de línea de comandos que se activaron de forma invisible por Platform Builder durante la compilación completa. Así que necesitaba saber todas esas opciones.

Mi solución fue ir a buscar en el archivo build.log, y encontrar la línea que ejecuta

CL blah-blah-blah myfile.c

Copié esta línea en el portapapeles. La parte "bla-bla-bla" contenía las opciones de compilación, y era enorme.

De vuelta en el IDE, hice clic derecho en myfile.c, elegí "Abrir ventana de compilación", y luego en esa ventana pegué la línea de comandos de compilación, y agregué un "/ P".

CL /P blah-blah-blah myfile.c

Done. Se produjo el archivo myfile.i, que contenía la salida del preprocesador.

8

No sé nada acerca de Microsoft compilador, pero en GCC se puede utilizar este:

gcc -E -P -o result.c my_file.h 

Si desea ver los comentarios usan este:

gcc -E -C -P -o result.c my_file.h 

Más opciones de anticipación this page .

+1

Esto también funciona con compiladores derivados de gcc, como qcc.exe, ¡gracias! – sage

2

CPIP es un nuevo preprocesador C/C++ escrito en Python. Si desea una representación visual detallada de un archivo preprocesado, pruébelo.

CPIP es un preprocesador C/C++ implementado en Python. La mayoría de los preprocesadores consideran el procesamiento previo como un trabajo sucio que solo debe hacerse lo antes posible. Esto puede hacer que sea muy difícil rastrear defectos sutiles en la etapa de preprocesamiento, ya que los preprocesadores eliminan una gran cantidad de información útil a favor de obtener el resultado lo más barato posible.

Pocos desarrolladores realmente entienden el procesamiento previo, para muchos es un poco oscuro de magia negra. El objetivo de CPIP es mejorar eso y registrar cada detalle del preprocesamiento para que CPIP pueda producir información maravillosamente visual sobre las dependencias de archivos, el uso de macros, etc.

CPIP no está diseñado para reemplazar a cpp (o cualquier otro preprocesador establecido), en cambio, CPIP considera que la claridad y la comprensión son más importantes que la velocidad de procesamiento.

2

En el sistema operativo Windows, una respuesta simple y una línea a esta pregunta es utilizar el siguiente comando en DOS para ver el archivo preprocesado:

CL /P /C myprogram.c 

Esto generará un archivo llamado myprogram.i. Ábralo y busque sus preprocesadores ampliados.

Cuestiones relacionadas