Pregunta

Estoy usando alguna macro en mi archivo fuente (* .c).

¿Hay alguna forma durante la compilación o desde la biblioteca que pueda identificar el archivo de encabezado exacto desde el cual se resuelve esta macro en particular?

El problema es que estamos usando una macro # definida a 10 en algún archivo de encabezado, pero el valor que se recibe en el código es 4. Entonces, en lugar de ir y revisar todos los archivos dep, queremos saber en caso de que haya alguna forma directa de identificar la fuente desde la cual se resolvió la macro.

¿Fue útil?

Solución

Si simplemente ejecuta cpp (el preprocesador de C) en el archivo, la salida contendrá las directivas #line del formulario

#line 45 "silly-file-with-macros.h"

para el compilador que dice de dónde viene todo. Entonces, una forma es usar

 cpp my-file.c | more

y busque la directiva #line .

Dependiendo de tu compilador, otro truco que podrías usar es redefinir la macro a otra cosa, y el compilador escupirá una advertencia como

test-eof.c:5:1: warning: "FRED" redefined
test-eof.c:3:1: warning: this is the location of the previous definition

(esto es de gcc) que debería indicarle dónde se definió la macro anteriormente. Pero ahora que lo pienso, ¿cómo es que ya no recibe esa advertencia?

Otra idea es usar makedepend para obtener una lista de todos los archivos incluidos, luego grep para las líneas de #define en ellos.

Otros consejos

grep para el #define?

find / -name '*.h' | xargs -L 100 grep -H macroname

Hay tres comandos allí. El comando find selecciona qué archivos se buscarán para que pueda cambiarlos a ' .c' o ' .cpp' o lo que necesite. Luego, el comando xargs, divide la lista de archivos en 100 a la vez para que no se desborde un poco del tamaño del búfer del comando de shell interno. Luego, el comando grep se ejecuta repetidamente con cada lista de 100 archivos e imprime cualquier nombre de archivo que contenga macroname y la línea de código que lo usa.

A partir de esto, debería poder ver dónde se está redefiniendo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top