Как мне использовать препроцессор C, чтобы сделать замену с переменной окружения - PullRequest
6 голосов
/ 20 февраля 2010

В приведенном ниже коде я бы хотел, чтобы значение THE_VERSION_STRING было взято из значения переменной среды MY_VERSION во время компиляции

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

Так что если я наберу:

export MY_VERSION="2010.4"

pluginRequires будет установлен на «2010.4», даже если MY_VERSION установлен во что-то другое во время выполнения.

ОБНОВЛЕНИЕ: (21 февраля) Спасибо всем за помощь. Оно работает. Поскольку я использую Rake в качестве системы сборки, каждый из моих CFLAGS является переменной ruby. Также значения должны заканчиваться в кавычках. Поэтому командная строка gcc для меня должна выглядеть так:

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

Что означает, что это в моем Rakefile:

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

Ответы [ 2 ]

13 голосов
/ 20 февраля 2010

Если я правильно помню, вы можете использовать параметр командной строки -D со значением gcc для #define во время компиляции.

т.е.:

$ gcc file.c -o file -D"THE_VERSION_STRING=${THE_VERSION_STRING}"
0 голосов
/ 20 февраля 2010

В приведенном ниже коде я хотел бы, чтобы значение THE_VERSION_STRING было взято из значения переменной среды MY_VERSION во время компиляции

Нет, вы не можете сделать это следующим образомэтот.Единственный способ извлечь переменные среды во время выполнения с помощью функции getenv().Вам нужно будет явно извлечь значение и скопировать его в pluginRequires.

Если вы хотите получить эффект от константы времени компиляции, вам нужно будет указать определение в командной строке компилятора как Сет предлагает.

...