2010-02-19 11 views
6

En el código siguiente, me gustaría que el valor de THE_VERSION_STRING que se lanzará desde el valor de la variable de entorno MY_VERSION en tiempo de compilación¿Cómo se utiliza el preprocesador C para hacer una sustitución con una variable de entorno

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

Así que si escribo:

export MY_VERSION="2010.4" 

pluginRequires se fijará en "2010.4", incluso si MY_VERSION se ajusta a otra cosa en tiempo de ejecución.

ACTUALIZACIÓN: (feb 21) Gracias por su ayuda a todos. Funciona. Como estoy usando Rake como sistema de compilación, cada uno de mis CFLAGS es una variable ruby. Además, los valores deben terminar entre comillas. Por lo tanto, la línea de comando gcc para mí tiene que tener este aspecto:

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

Lo que significa esto es en mi Rakefile:

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

Esto no es algo que el preprocesador hará. Esto es algo que su sistema de compilación debería hacer. – GManNickG

Respuesta

13

Si no recuerdo mal, puede utilizar el parámetro de línea de comandos -D con gcc a #define un valor en tiempo de compilación.

es decir:

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

¿No debería ser '-DTHE_VERSION_STRING =" $ (THE_VERSION_STRING) "'? – bk1e

+0

@ bk1e Sí, creo que tienes razón; sin embargo, los documentos sí lo muestran como '-D name = definition', así que tal vez no importe. – Seth

+0

@ bk1e: no paréntesis - llaves funcionarían pero no son necesarias. –

0

En el código siguiente, me gustaría que el valor de THE_VERSION_STRING que se lanzará desde el valor del medio ambiente MY_VERSION variable en tiempo de compilación

No, no puedo hacerlo así La única forma de extraer variables de entorno es en tiempo de ejecución con la función getenv(). Deberá extraer explícitamente el valor y copiarlo en pluginRequires.

Si desea el efecto de una constante en tiempo de compilación, tendrá que especificar la definición en la línea de comandos del compilador como sugiere Seth.

Cuestiones relacionadas