2012-12-05 49 views
5

我在make文件中使用以下代碼從CPP文件訪問變量VENDOR_NAME。在CPP文件中使用make文件字符串變量

EXTRA_DEFINE += -DVENDOR_NAME=$(VENDOR_NAME) VENDOR_NAME包含一個字符串。

在我的cpp文件中,當我嘗試使用這個變量時,我得到如下給出的錯誤。

cout << VENDOR_NAME;

Feature1.cpp.bak.cpp:8:「Default_Vendor」未申報(第一次使用此功能) Feature1.cpp.bak.cpp:8:(每個未聲明的標識符爲

我想這是因爲我的字符串不包含雙引號和編譯器是隻報告一次將VENDOR_NAME的內容視爲一個變量。

如何在我的CPP文件中將此變量作爲字符串獲取,以便我可以像使用它一樣使用它#define ed?

謝謝...

回答

10

您的makefile將爲編譯器創建一個命令行。所產生的問題是,如果你只是包圍引號的值:

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

...外殼會看到報價爲簡單地劃定一個命令行參數,所以它可能會剝奪他們過(儘管它可以依賴你使用的shell)。爲了防止這種情況,你要與轉義引號創建參數:

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

我認爲最典型的殼,至少對Windows和Linux的,將接受一個反斜槓作爲轉義保留引號,但我相信至少有一個,你必須做不同的引用。

+0

這是缺少宏展開的水平...棘手 – Potatoswatter

+0

@Potatoswatter:再也沒有! :-) –

+0

@Jerry Coffin:謝謝。這足以拯救一天..再見宏!:) – NeonGlow

3

使用預處理器將其轉換爲字符串。

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

std::cout << stringify(VENDOR_NAME); 

鑑於複雜的宏預處理器的支持(正式C++ 11,在現有實踐更長的時間),VENDOR_NAME可以包括一個逗號:

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

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

如果'VENDOR_NAME'包含逗號(例如「Foo,Inc.」),則可能有問題。可能最好是在makefile文件中處理引用。 – jamesdlin

+0

@Patatoswatter:非常感謝您的回答。如果我可以在make文件中做到這一點,它會更有用。請讓我知道你是否可以幫忙。 – NeonGlow

+0

@jamesdin:謝謝你指出。你能進一步幫助我如何做到這一點? – NeonGlow