2012-12-05 12 views
5

W pliku make używam następującego kodu, aby uzyskać dostęp do zmiennej VENDOR_NAME z pliku CPP.Użycie zmiennej łańcuchowej pliku make w pliku CPP

EXTRA_DEFINE += -DVENDOR_NAME=$(VENDOR_NAME) VENDOR_NAME zawiera ciąg.

W moim pliku cpp, gdy próbuję użyć tej zmiennej, otrzymuję błędy podane poniżej.

cout << VENDOR_NAME;

Feature1.cpp.bak.cpp:8: „Default_Vendor” nierejestrowanej (pierwszy skorzystać z tej funkcji) Feature1.cpp.bak.cpp:8: (Każdy identyfikator nierejestrowana jest zgłaszane tylko raz na

Chyba to dlatego mój ciąg nie zawiera podwójne cudzysłowy i kompilator biorąc pod uwagę zawartość VENDOR_NAME jako zmienną

Jak uzyskać tę zmienną jako ciąg w moim pliku CPP, aby można go było używać tak, jakbym miał #define ed?

Dzięki ...

Odpowiedz

10

Twój makefile utworzy linię komend dla kompilatora. Problem, który powstaje jest to, że jeśli tylko otoczyć wartość w cudzysłowach:

EXTRA_DEFINE += -DVENDOR_NAME="$(VENDOR_NAME)" 

... powłoka będzie zobaczyć cytaty jako po prostu wyznaczającej argument wiersza poleceń, więc będzie to prawdopodobnie rozebrać je (choć może zależeć od powłoki, z której korzystasz). Aby temu zapobiec, będziemy chcieli stworzyć argument ze zbiegłych cytatów:

EXTRA_DEFINE += -DVENDOR_NAME="\"$(VENDOR_NAME)\"" 

Myślę, że większość typowych muszli, przynajmniej dla Windows i Linux, zaakceptuje back-slash jako ucieczki, aby zachować cytuje, ale jestem pewien, że istnieje co najmniej jeden, dla którego będziesz musiał zrobić cytowanie w inny sposób.

+0

Że brakuje poziomu makr ... trudne – Potatoswatter

+0

@Potatoswatter: Już nie! :-) –

+0

@Jerry Coffin: Dziękuję. To więcej niż potrzeba, by uratować dzień. Pożegnanie z makrami :) – NeonGlow

3

Użyj preprocesora, aby przekształcić go w ciąg.

#define stringify(x) stringify_literal(x) 
#define stringify_literal(x) # x 

std::cout << stringify(VENDOR_NAME); 

Biorąc pod uwagę wsparcie preprocesora o zmiennej liczbie argumentów makra (oficjalnie C++ 11, w praktyce dostępnej znacznie dłużej), VENDOR_NAME może zawierać przecinka:

#define stringify(...) stringify_literal(__VA_ARGS__) 
#define stringify_literal(...) # __VA_ARGS__ 

std::cout << stringify(VENDOR_NAME); 
+1

Może mieć problemy, jeśli "VENDOR_NAME" zawiera przecinek (np. "Foo, Inc."). Prawdopodobnie najlepiej radzić sobie z cytowaniem w pliku makefile. – jamesdlin

+0

@Potatoswatter: Dziękuję bardzo za odpowiedź. Bardziej przyda mi się, jeśli mogę to zrobić w samym pliku make. Daj mi znać, jeśli możesz pomóc. – NeonGlow

+0

@jamesdin: Dziękuję za wskazanie. Czy możesz mi pomóc, jak to zrobić? – NeonGlow

Powiązane problemy