2010-02-19 6 views
6

Nel seguente codice, desidero il valore di THE_VERSION_STRING essere preso dal valore della variabile di ambiente MY_VERSION al momento della compilazioneCome si utilizza il preprocessore C effettua una sostituzione con un ambiente variabile

namespace myPluginStrings { 
const char* pluginVendor = "me"; 
const char* pluginRequires = THE_VERSION_STRING; 
}; 

Così che se digito:

export MY_VERSION="2010.4" 

pluginRequires sarà fissato a "2010.4", anche se MY_VERSION è impostato su qualcosa d'altro in fase di esecuzione.

AGGIORNAMENTO: (21 febbraio) Grazie per il vostro aiuto a tutti. Funziona. Poiché utilizzo Rake come un sistema di compilazione, ciascuno dei miei CFLAGS è una variabile ruby. Anche i valori devono finire tra virgolette. Pertanto la linea di comando gcc per me ha bisogno di guardare in questo modo:

gcc file.c -o file -D"PLUGIN_VERSION=\"6.5\"" 

Il che significa che questo è nel mio Rakefile:

"-D\"PLUGIN_VERSION=\\\"#{ENV['MY_VERSION']}\\\"\"" 
+4

Questo non è qualcosa che il preprocessore farà. Questo è qualcosa che il tuo sistema di build dovrebbe fare. – GManNickG

risposta

13

Se ricordo bene, è possibile utilizzare il parametro di riga di comando -D con gcc a #define un valore in fase di compilazione.

cioè:

$ gcc file.c -o file -D"THE_VERSION_STRING=${THE_VERSION_STRING}" 
+0

Non dovrebbe essere '-DTHE_VERSION_STRING =" $ (THE_VERSION_STRING) "'? – bk1e

+0

@ bk1e Sì, penso che tu abbia ragione - i documenti in realtà lo mostrano come '-D name = definition', anche se forse non importa. – Seth

+0

@ bk1e: non parentesi: le parentesi potrebbero funzionare ma non sono necessarie. –

0

Nel codice qui sotto, vorrei che il valore della THE_VERSION_STRING da prendere dal valore dell'ambiente MY_VERSION variabile al momento della compilazione

No, non posso farlo in questo modo L'unico modo per estrarre le variabili di ambiente è in fase di runtime con la funzione getenv(). Dovrai estrarre esplicitamente il valore e copiarlo su pluginRequires.

Se si desidera l'effetto di una costante in fase di compilazione, è necessario specificare la definizione sulla riga di comando del compilatore come suggerito da Seth.

Problemi correlati