2010-02-19 10 views
6

W poniższym kodzie, chciałbym wartość THE_VERSION_STRING należy podjąć od wartości zmiennej środowiskowej MY_VERSION w czasie kompilacjiJak używać preprocesora C zmuszony w środowisku zmiennym

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

więc, że jeśli typ:

export MY_VERSION="2010.4" 

pluginRequires zostanie ustawiony na „2010.4”, nawet jeśli MY_VERSION jest ustawiony na coś innego w czasie wykonywania.

AKTUALIZACJA: (Feb 21) Dzięki za pomoc dla wszystkich. To działa. Ponieważ używam Rake jako systemu kompilacji, każda z moich CFLAGS jest zmienną ruby. Również wartości muszą kończyć się w cudzysłowach. Dlatego linia poleceń gcc dla mnie powinien wyglądać następująco:

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

Co oznacza to w moim Rakefile:

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

To nie jest coś, co zrobi preprocesor. To jest coś, co musiałby zrobić twój system kompilacji. – GManNickG

Odpowiedz

13

Jeśli dobrze pamiętam, można użyć parametru wiersza poleceń -D z gcc do #define wartość w czasie kompilacji.

tj:

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

Czy nie powinno to być "-DTHE_VERSION_STRING =" $ (THE_VERSION_STRING) "'? – bk1e

+0

@ bk1e Tak, myślę, że masz rację - doktorzy faktycznie pokazują to jako '-D nazwa = definicja", więc może to nie ma znaczenia. – Seth

+0

@ bk1e: bez nawiasów - nawiasy klamrowe działałyby, ale nie są konieczne. –

0

W poniższym kodzie, chciałbym wartość THE_VERSION_STRING należy podjąć od wartości zmiennej środowiskowej MY_VERSION w czasie kompilacji

Nie, nie mogę tego zrobić tak. Jedynym sposobem wyodrębnienia zmiennych środowiskowych jest uruchomienie przy pomocy funkcji getenv(). Będziesz musiał jawnie wyodrębnić wartość i skopiować ją do pluginRequires.

Jeśli chcesz uzyskać efekt stałej kompilacji, musisz podać definicję z wiersza poleceń kompilatora jako sugerowaną przez Seth.