que programacion procesador preprocesamiento preprocesador lenguaje informatica ifdef funcion ejemplos directivas directiva define compilador c++ gcc c-preprocessor

c++ - programacion - que es un preprocesador en informatica



¿Cómo saber(en GCC) cuando se declara el símbolo de macro/preprocesador? (6)

Supongamos que tengo #define foo en varios archivos de encabezado. Puede expandirse a algunas cosas diferentes. Me gustaría saber (al compilar un archivo .cc) cuándo se encuentra un #define, a qué se expandirá, qué archivo es y de dónde se ha incluido.

¿Es posible? Si no, ¿hay alguna solución parcial que pueda ayudar?

Siéntase libre de agregar comentarios con solicitudes de aclaración.

Editar: las respuestas actuales parecen concentrarse en el caso cuando hay un #define y solo quiero saltar a la definición o saber cuál es la definición. Ese es el caso simple y sí, sus soluciones funcionan. Pero cuando tengo el mismo #define en diferentes archivos, y quiero saber cuál de ellos entra primero, ninguna de estas técnicas es útil. De acuerdo, en realidad usé #warning cuidadosamente para encontrar el lugar correcto. Pero esto requiere mucho trabajo.


U ver :

# shows preprocessed source with cpp internals removed g++ -E -P file.cc # shows preprocessed source kept with macros and include directives g++ -E -dD -dI -P file.cc

Los elementos internos de arriba son marcadores de línea para gcc que son un poco confusos cuando lee la salida. -P quita

-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. Input files which don''t require preprocessing are ignored.

Nota: los comentarios se quejan correctamente de que esto es solo una solución parcial. No le dirá cuándo se reemplazará una macro. Le muestra la fuente preprocesada, que puede ser útil de todos modos.


Un IDE bueno puede hacer esto por usted a través de alguna forma de salto a la definición.


Use # advertencia. Se describe aquí .


para "a lo que se expandirá" utilizo el interruptor -E en gcc que da la salida preprocesada. Pero no hay ninguna traza inversa de la macro de dónde (o si había una macro en absoluto).

Otra opción que puede usar es -g3, esto agrega información de depuración con respecto a las macros, es decir, luego puede ver en su depurador la definición de cada macro.


No lo ayudará a encontrar dónde se definió, pero puede ver la definición de un archivo en particular mediante el uso de las marcas -E -dM

g++ -E -dM file.cpp | grep MACRO


Me gustaría saber (cuando se compila un archivo .cc) cuando se encuentra un #define,

Conozco una solución para eso . Compile el archivo con el símbolo ya definido como código ilegal de C ++ (el artículo vinculado utiliza ''@''). Entonces, para GCC escribirías

gcc my_file.c -Dfoo=@

Cuando eso se expanda, se garantiza que causará un error de sintaxis, y el compilador debería decirle qué archivo es el error de sintaxis, lo cual será muy útil.

Si utiliza el truco que Raymond Chen sugiere, el compilador puede decirle de dónde proviene la definición "conflictiva" y puede darle una lista de cómo se incluyó. Pero no hay garantía. Como no uso macros (prefiero const y enum), no puedo decir si GCC es uno de los compiladores más inteligentes en este aspecto. No creo que los estándares C o C ++ digan nada al respecto, aparte de que una vez que se ejecuta el preprocesador, pierde todo tipo de información útil.