2008-11-14 12 views
9

Supongamos que tengo foo # define en varios archivos de cabecera. 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.¿Cómo saber (en GCC) cuando se declara el símbolo de macro/preprocesador?

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

Siéntase libre de añadir comentarios a las solicitudes de aclaración.

Edición: las respuestas actuales parecen concentrarse en el caso cuando hay una #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.

+0

¿Qué quiere exactamente que haga cuando se encuentre con sus macros en la compilación? –

+0

@Greg: imprimir información: tal o cual acaba de ser definido. Se expandiría a (...). Esto está en el archivo (...), línea (...). Incluido desde (una "rastredad de #includes que regresa a mi archivo .cc". –

+1

Tendría un muy mal presentimiento sobre cualquier software donde esto hiciera la diferencia. –

Respuesta

17

Uso -E:

# 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 detalles internos anteriormente son Hoja de marcadores para gcc que son un poco confuso cuando se lee la salida. -P los despoja

 -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 esto es sólo 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.

+0

This trabaja en archivos enteros, no en #defines individuales, y no proporciona el resto de la información que buscaba @phjr. –

+0

De hecho, es solo una solución parcial :) –

+0

Si no se usa '-P' (mantener las partes internas) , en el que se define la macro del archivo se puede ver fácilmente. – Erdem

0

Uso #warning. Se describe here.

+1

No está claro cómo '# warning 'ayudaría aquí. – skyking

1

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

Otra opción que podría utilizar es -g3, esto se suma la información de depuración en relación con las macros, es decir, se puede ver más tarde en el depurador la definición de cada macro.

2

No lo puedo ayudarle a encontrar donde se definió pero se puede ver la definición de un archivo en particular mediante el uso de las banderas -E dm

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

Y luego busque su macro desde abajo. Para conocer el archivo, puede detectar la correspondiente definición de ___HEADER_FILE_H__. – Vijayender

1

un buen IDE puede hacer esto para usted en la demanda a través de algún forma de saltar a la definición.

5

me gustaría saber (al compilar un archivo .cc) cuando se encuentra un #define,

I know a solution to that. Compile el archivo con el símbolo ya definido como código ilegal de C++ (el artículo vinculado utiliza '@'). Por lo tanto, para GCC que iba a escribir

gcc my_file.c [email protected] 

Cuando eso se expande ha garantizado para causar un error de sintaxis, y el compilador que qué archivo de error de sintaxis se encuentra, lo que será muy útil debe contar.

Si utiliza el truco Raymond Chen sugiere, el compilador puede se le indicará dónde la definición de "conflicto" vino de, y puede le dará una lista de cómo llegó incluido. 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.

+0

Buena idea, pero eso no funcionará si la definición está resguardada por un '#ifndef foo'. – skyking

Cuestiones relacionadas