2013-08-28 15 views
5

Vorrei eseguire l'override di una macro dalla riga di comando. Da qualche parte nella mia fonte, v'è una definizione come questa:Ignora macro dalla riga di comando

#define MY_FOO 1 

Quello che vorrei è quello di impostare il valore di questa macro quando compilo il mio programma:

g++ -DMY_FOO=2 ... 

Ma poi, la macro è ridefinito dal codice sorgente al suo vecchio valore 1. Il problema è che non possiedo la parte della sorgente che definisce la macro in primo luogo. Se fosse il mio codice, potrei semplicemente scrivere

#ifndef MY_FOO 
#define MY_FOO 1 
#endif 

E il mio problema sarebbe scomparso. Quindi c'è modo di specificare una macro sulla riga di comando usando g ++ in modo che il codice sorgente non possa ridefinirlo?

+1

Perché vuoi farlo? Potrebbe esserci un altro modo se ci dici il vero problema – doctorlove

+3

Ti serve avere la tua definizione all'interno del file di intestazione stessa, o funzionerebbe semplicemente '# undef' dopo il tuo' # include'? – svk

+0

Il vero problema è che sto lavorando a un progetto in cui il livello di debug di diversi flussi di output è impostato usando config.h, che a sua volta viene generato dagli autotools. Ma voglio solo compilare un semplice programma di test nel mio pacchetto con un livello di debug più alto e non voglio riconfigurare l'intero pacchetto, perché questo richiede un po 'di tempo. – Sh4pe

risposta

7

Non è possibile.

La riga di comando viene gestita prima di qualsiasi file di origine e di intestazione.
Se un file sorgente definisce una macro, non deve essere definita prima e riceverà il nuovo valore da ora in poi.
L'unico modo per modificarlo è quello di #undef e #define di nuovo, in un secondo momento. Se hai accesso a un'intestazione inclusa dopo la definizione, hai una possibilità.

0

Se si sta tentando di creare qualcosa che è configurabile dalla riga di comando e si può modificare il codice sorgente, è possibile utilizzare #ifndef per definire la macro solo se non è già definita. Quindi, quando definisci la macro, il codice la vedrà e non la sovrascriverà, ma se non la definisci avrà un valore predefinito.

0

Se il file config.h impedisce che più inclusioni (via #ifndef CONFIG_H ecc), allora si potrebbe abusare che:

g++ -DMY_FOO=2 -DCONFIG_H 

Nota: se il file config.h contiene qualsiasi altra cosa che avete bisogno, quindi devi definirlo di nuovo anche tu. Potresti fare una copia del file come my_config.h e includerlo. (Vedere anche l'opzione del preprocessore -include file).