Vedere macro C espanse

Se voglio espandere una macro C, quali sono alcuni buoni modi per farlo (oltre a tracciarlo manualmente)?

Ad esempio, GTK_WIDGET_SET_FLAGS , utilizza una macro che utilizza una macro che utilizza una macro (o due) …

Voglio vederlo in qualche modo espanso automaticamente, invece di cercare ogni macro, in ogni fase del percorso.

AGGIORNARE

Ho provato cpp, ma sembrava fare solo il primo passaggio

sopra:

 GTK_WIDGET_SET_FLAGS(obj, 13) 

Ho ottenuto l’estensione del file include, quindi:

 G_STMT_START{ ((GTK_OBJECT_FLAGS (obj)) |= (13)); }G_STMT_END 

Questo è spiegato da questo messaggio di errore. Ottengo questo su stderr (quando si utilizza -o filename)

 gtk / gtkwidget.h: 34: 21: gdk / gdk.h: nessun file o directory di questo tipo
 gtk / gtkwidget.h: 35: 31: gtk / gtkaccelgroup.h: Nessun file o directory di questo tipo
 gtk / gtkwidget.h: 36: 27: gtk / gtkobject.h: Nessun file o directory di questo tipo
 gtk / gtkwidget.h: 37: 31: gtk / gtkadjustment.h: Nessun file o directory di questo tipo
 gtk / gtkwidget.h: 38: 26: gtk / gtkstyle.h: nessun file o directory di questo tipo
 gtk / gtkwidget.h: 39: 29: gtk / gtksettings.h: Nessun file o directory di questo tipo
 gtk / gtkwidget.h: 40: 21: atk / atk.h: nessun file o directory di questo tipo

le directory gtk, atk e gdk sono tutte nella directory di lavoro corrente, quindi come faccio a fare in modo che cpp cerchi dentro di esso?

btw, gcc -E fornisce esattamente lo stesso risultato di cpp

Update2:

Il problema del percorso di inclusione viene risolto utilizzando gcc -E e passando la directory di inclusione con l’opzione -I

A seconda del compilatore che si usa, dovrebbe esserci un modo per vedere il codice dopo il preprocessore (che fa l’espansione della macro, le macro non sono affatto conosciute dal compilatore).

Con gcc, l’opzione è -E . Ecco un esempio semplificato, utilizzando il codice giocattolo e non la macro GTK + effettiva:

 ~/tmp> cat cpptest.c #define SET_FLAGS(w, f) ((w)->flags |= (f)) int main(void) { SET_FLAGS(0, 4711); return 0; } ~/tmp> gcc -E cpptest.c # 1 "cpptest.c" # 1 "" # 1 "" # 1 "cpptest.c" int main(void) { ((0)->flags |= (4711)); return 0; } 

In Visual Studio, è ansible generare il file dell’unità di traduzione generato dal preprocessore. È ansible selezionare le opzioni di progetto, C / C ++ / Preprocessore e inserire “Genera file preelaborato” o “Preprocesso su un file” su Sì (oppure utilizzare il commutatore / P o / EP per includere i numeri di riga o meno).

È ansible scaricare l’espansione di una macro in fase di esecuzione in questo modo:

 #include  /* * generic helper macros */ #define CALL(macro, arguments) macro arguments #define STR(...) STR_(__VA_ARGS__) #define STR_(...) # __VA_ARGS__ /* * dumps a macro and its expansion to stdout * the second argument is optional and specifies the number of * arguments that macro takes: 0 means macro takes zero arguments * no second argument means macro is not function-like */ #define DUMP_MACRO(macro, ...) \ do { \ puts ( \ "'" \ # macro STR(DUMP_MACRO_ARGS_ ## __VA_ARGS__) \ "' expands to '" \ STR(CALL(macro, DUMP_MACRO_ARGS_ ## __VA_ARGS__)) \ "'" \ ); \ } while (0) /* helpers for DUMP_MACRO, add more if required */ #define DUMP_MACRO_ARGS_ #define DUMP_MACRO_ARGS_0 () #define DUMP_MACRO_ARGS_1 (<1>) #define DUMP_MACRO_ARGS_2 (<1>, <2>) #define DUMP_MACRO_ARGS_3 (<1>, <2>, <3>) /* * macros to be used in examples for DUMP_MACRO */ #define EXAMPLE ( EXAMPLE0() << 9 ) #define EXAMPLE0() __GNUC__ #define EXAMPLE1(EXAMPLE1) EXAMPLE1 #define EXAMPLE3(EXAMPLE1, _, __) ( EXAMPLE1 ? _(__) : false ) int main() { /* examples */ DUMP_MACRO(EXAMPLE); DUMP_MACRO(EXAMPLE0, 0); DUMP_MACRO(EXAMPLE1, 1); DUMP_MACRO(EXAMPLE3, 3); DUMP_MACRO(EXAMPLE3(EXAMPLE, EXAMPLE1, non_macro_symbol)); /* does not work for DUMP_MACRO itself, because the preprocessor does not allow recursion */ DUMP_MACRO(DUMP_MACRO, 1); DUMP_MACRO(DUMP_MACRO, 2); return 0; } 

Il programma stampa:

 'EXAMPLE' expands to '( 4 << 9 )' 'EXAMPLE0()' expands to '4' 'EXAMPLE1(<1>)' expands to '<1>' 'EXAMPLE3(<1>, <2>, <3>)' expands to '( <1> ? <2>(<3>) : false )' 'EXAMPLE3(EXAMPLE, EXAMPLE1, non_macro_symbol)' expands to '( ( 4 << 9 ) ? non_macro_symbol : false )' 'DUMP_MACRO(<1>)' expands to 'DUMP_MACRO (<1>)' 'DUMP_MACRO(<1>, <2>)' expands to 'DUMP_MACRO (<1>, <2>)' 

Tuttavia questo produce solo la piena espansione. Se hai bisogno di singoli passaggi, Eclipse / CDT può aiutarti, ma solo se insegni a tutte le intestazioni e le bandiere del compilatore che usi.

 gcc -E myfile.c 

Se usi gcc puoi anche eseguire

 cpp myfile.c 

Molti IDE mostreranno la versione espansa della macro nell’editor quando il puntatore del mouse passa sopra l’identificatore (o in un altro modo). So che Eclipse / CDT fa questo, e Visual Studio fa questo (almeno VS 2008 fa).

Avere il compilatore generare l’output preelaborato può essere utile se stai rintracciando un problema complicato, ma per l’uso giorno dopo giorno dove vuoi solo sapere che cosa sta succedendo con il codice sullo schermo, usare l’IDE è il modo di partire.

gcc anche con -E ha bisogno del percorso dei file header … come -I _path_to_your_headers …

Se hai un Makefile, in generale, ciò che potresti fare è superare CC con gcc -E

Generalmente, cpp è solo uno script che aggiunge alcuni flag a gcc per il preprocessore, come il tradizionale …

Si desidera eseguire solo la fase del preprocessore del compilatore, responsabile per l’espansione delle macro. Per gcc , è “gcc -E”, ma non sono sicuro degli altri compilatori.

Prova a eseguire cpp sul tuo file sorgente

Hai provato a eseguire gcc -E più volte fino a quando non ci sono più macro?

Quando sei intrappolato in un IDE abbozzato, prova qualcosa di simile

 #define DISPLAY_VALUE2(x) #x #define DISPLAY_VALUE(x) DISPLAY_VALUE2(x) #pragma message("#DEFINE F_CPU " DISPLAY_VALUE(F_CPU)) 

produrre

 …/sketch_may21a.ino: In function 'void loop()': …/sketch_may21a.ino:10:54: note: #pragma message: #DEFINE F_CPU 16000000L #pragma message("#DEFINE F_CPU " DISPLAY_VALUE(F_CPU)) ^ 

grazie a “mdematos” su http://MicroChip.com/forums/m724722.aspx