2010-02-19 2 views
6

Dans le code ci-dessous, je voudrais la valeur de THE_VERSION_STRING à prendre de la valeur de la variable d'environnement MY_VERSION au moment de la compilationComment puis-je utiliser le préprocesseur C pour faire une substitution avec un variable d'environnement

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

Alors que si je tape:

export MY_VERSION="2010.4" 

pluginRequires sera fixée à « 2010.4 », même si MY_VERSION est réglé sur quelque chose d'autre au moment de l'exécution.

MISE À JOUR: (fév 21) Merci pour votre aide à tous. Ça marche. Comme j'utilise Rake comme système de construction, chacune de mes CFLAGS est une variable ruby. Les valeurs doivent également se retrouver entre guillemets. Par conséquent, la ligne de commande gcc pour moi doit ressembler à ceci:

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

Ce qui signifie que cela est dans mon Rakefile:

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

Ce n'est pas quelque chose que le préprocesseur fera. C'est quelque chose que votre système de construction devrait faire. – GManNickG

Répondre

13

Si je me souviens bien, vous pouvez utiliser le paramètre de ligne de commande -D avec gcc à #define une valeur au moment de la compilation.

-à-dire:

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

Cela ne devrait-il pas être '-DTHE_VERSION_STRING =" $ (THE_VERSION_STRING) "'? – bk1e

+0

@ bk1e Oui, je pense que vous avez raison - les docs l'affichent réellement comme '-D name = definition', alors peut-être que cela n'a pas d'importance. – Seth

+0

@ bk1e: pas de parenthèses - les accolades fonctionneraient mais ne sont pas nécessaires. –

0

Dans le code ci-dessous, je voudrais la valeur de THE_VERSION_STRING à prendre de la valeur de l'environnement MY_VERSION variable à la compilation

Non, Je ne peux pas le faire comme ça. La seule façon d'extraire les variables d'environnement est à l'exécution avec la fonction getenv(). Vous devrez extraire explicitement la valeur et la copier au pluginRequires.

Si vous voulez l'effet d'une constante à la compilation, vous devrez spécifier la définition sur la ligne de commande du compilateur comme le suggère Seth.

Questions connexes