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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top