identificare il file di intestazione esatto
Domanda
Sto usando alcune macro nel mio file sorgente (* .c).
Esiste un modo durante la compilazione o dalla libreria che posso identificare il file di intestazione esatto da cui questa particolare macro viene risolta?
Il problema è che stiamo usando una macro # definita in 10 in alcuni file di intestazione, ma il valore che viene ricevuto nel codice è 4. Quindi, invece di andare e controllare tutti i file dep, vogliamo sapere se esiste un modo diretto per identificare l'origine da cui la macro è stata risolta.
Soluzione
Se si esegue semplicemente cpp (il preprocessore C) sul file, l'output conterrà le direttive #line del modulo
#line 45 "silly-file-with-macros.h"
per il compilatore che dice da dove proviene tutto. Quindi un modo è usare
cpp my-file.c | more
e cerca la direttiva #line
.
A seconda del compilatore, un altro trucco che potresti usare è ridefinire la macro in qualcos'altro e il compilatore emetterà un avviso come
test-eof.c:5:1: warning: "FRED" redefined
test-eof.c:3:1: warning: this is the location of the previous definition
(questo è da gcc) che dovrebbe dirti dove era stata precedentemente definita la macro. Ma vieni a pensarci bene, come mai non ricevi già questo avviso?
Un'altra idea è quella di utilizzare makedepend
per ottenere un elenco di tutti i file inclusi, quindi grep per le righe #define
.
Altri suggerimenti
grep per #define?
find / -name '*.h' | xargs -L 100 grep -H macroname
Ci sono tre comandi lì. Il comando find seleziona i file da cercare in modo da poterli modificare in " .c" o " .cpp" o in qualsiasi altra cosa sia necessaria. Quindi il comando xargs, divide l'elenco di file in 100 alla volta in modo da non sovraccaricare alcune dimensioni del buffer dei comandi della shell interna. Quindi il comando grep viene eseguito ripetutamente con ogni elenco di 100 file e stampa tutti i nomi di file contenenti macroname e la riga di codice che lo utilizza.
Da questo dovresti essere in grado di vedere dove viene ridefinito.