¿Cómo veo un archivo fuente C / C ++ después del preprocesamiento en Visual Studio?

206

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 con él?

Geo
fuente
Sería útil si proporcionara más información, como qué compilador está utilizando.
JaredPar
Actualmente estoy usando Visual Studio 2005 como mi IDE.
Geo
Entonces, de forma predeterminada, está utilizando el compilador cl.exe.
Martin York
3
¿Por qué se aceptó una respuesta de gcc cuando dijo que estaba usando VS2005?
Jim Buck
Relacionado: Información del compilador .
Laurie Stearn

Respuestas:

147

cl.exe, la interfaz de línea de comandos para Microsoft Visual C ++, tiene tres opciones diferentes para generar el archivo preprocesado (de ahí la inconsistencia en las respuestas anteriores sobre Visual C ++):

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

bk1e
fuente
1
¿Cómo paso estos comandos a un proyecto con nmake y Makefile?
WooDzu
@WooDzu Use NMAKE (nmake.exe) para automatizar tareas que crean proyectos de Visual C ++ mediante un archivo MAKE tradicional. ~ msdn.microsoft.com/en-us/library/f35ctcxw.aspx
G.Rassovsky
8
Tenga en cuenta que /Psuprimirá la generación de archivos obj. Entonces, si pone /Popciones, puede obtener un error de enlace que dice que no se pueden encontrar algunos archivos obj porque en realidad no se genera en absoluto.
smwikipedia
Asegúrese de estar dentro VS Developer command prompty NO dentro Command promptcuando intente utilizar el compilador de MS ( cl). El compilador no está disponible en el comando convencional.
dmytro.poliarush
Comunidad VS2019: el error / P LNK 1104 todavía está activo en la prensa.
Laurie Stearn
119

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

Entonces puedes simplemente ejecutar:

gcc -E foo.c

Si no puede encontrar esa opción, también puede encontrar el preprocesador C en su máquina. Por lo general, se llama cpp y probablemente ya esté en tu camino. Invocarlo así:

cpp foo.c

Si hay encabezados que necesita incluir desde otros directorios, puede pasar -I / ruta / a / incluir / dir a cualquiera de estos, tal como lo haría con una compilación regular.

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

Todd Gamblin
fuente
2
pregunta de gcc: stackoverflow.com/questions/3916979/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
100

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. Luego 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).

Jim Buck
fuente
9
"Preproceso a un archivo" en VS2010.
Rob W
18
Por cierto, el archivo se crea en el directorio de salida (por ejemplo Release, Debug) con una extensión .i.
Steed
1
Esto ayuda mucho ya que utiliza la configuración de compilación ya configurada en el proyecto para encontrar todos los encabezados correctos.
IanH
Tenga en cuenta que para mí en MSVC 2015, el archivo .i no estaba en el Directorio de salida , sino en el Directorio intermedio del proyecto . Estos no son lo mismo si, por ejemplo, genera sus proyectos utilizando CMake.
user1556435
19

Por lo general, debe realizar un procesamiento posterior en la salida del preprocesador; de lo contrario, todas las macros simplemente se expanden a un revestimiento, lo que es difícil de leer y depurar. Para el código C, algo como lo 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 ++, este script de Perl me pareció útil.

ididak
fuente
8

No sé nada sobre el compilador de Microsoft, pero en GCC puedes usar esto:

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

Si quieres ver comentarios usa esto:

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

Más opciones disponibles en esta página .

dzav
fuente
1
Esto también funciona con compiladores derivados de gcc, como qcc.exe, ¡gracias!
sabio
8

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

Atempcode
fuente
6

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

Andreas Magnusson
fuente
5

Como respondieron bk1e y Andreas M., la opción / P para el compilador hará que preprocese un archivo. Sin embargo, en mi proyecto usando VS2005 y Platform Builder (para un procesador ARM incorporado), 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 conocía todas las opciones apropiadas de línea de comandos que Platform Builder estaba activando de manera invisible durante la compilación completa. Así que necesitaba saber todas esas opciones.

Mi solución fue buscar en el archivo build.log y encontrar la línea que se ejecutó

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

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

Sam Pittman
fuente
2

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

CPIP es un preprocesador C / C ++ implementado en Python. La mayoría de los preprocesadores consideran el preprocesamiento 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 arrojan mucha información útil para obtener el resultado lo más barato posible.

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

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

thegreendroid
fuente
2

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

CL /P /C myprogram.c

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

manty
fuente