2017-07-06 82 views
0

我遇到以下問題:基於主機名的C++,g ++,條件編譯?

我們的測試環境無法完全模擬生產環境中的某個硬件部分,因此某些代碼在測試應用程序時需要排除。

因此我需要的東西在

#IFNDEF testing_env 
//code to exclude 
#ENDIF 

如果我包括#DEFINE testing_env這只是正常的方式,但這樣的我需要手動註釋/取消註釋這個定義我每次轉換環境的時間。

我正在尋找一種基於主機名或類似功能執行此操作的方法。我試圖尋找基於環境變量的條件編譯,但顯然這是不可能的。

+0

顯然它可以使用環境變量:https://stackoverflow.com/questions/25184148/can-i-define-an-environment-variable-and-use-it-in-conditional-compilation – user463035818

+0

爲什麼不把它移動到'test runner level'?在任何環境屬性上運行不運行測試depedn。 – fghj

+0

不會'-D testing_env'工作? –

回答

3

通常您爲其他環境創建測試env(專用make規則)的特定生成配置文件和另一個生成配置文件(其他生成規則)。

然後可以在編譯行(通常在Makefile中)使用-DTEST_ENVIRONMENT指定測試環境,例如。使用-D選項的:

g++ -DTEST_ENVIRONMENT -o test main.c

然後

#IFNDEF TEST_ENVIRONMENT 
//code to exclude 
#ENDIF 

將正常工作。

1

你的Makefile可以確定主機名,並設置與-D具體的增值經銷商爲您打造:

例子:

HOSTNAME=$(shell hostname) 

ifeq ($(HOSTNAME), localhost1.localdomain) 
    ANY_VAR=COMPILE_VERSION_1 
else 
    ANY_VAR=COMPILE_VERSION_2 
endif 

$(info $(HOSTNAME)) 
$(info $(ANY_VAR)) 

%.o: %.cpp 
    g++ -D$(ANY_VAR) $< -c 

OBJECTS=main.o 

go: $(OBJECTS) 
    g++ $^ -o go 

clean: 
    rm -f *.o 
    rm -f go 

你的C/C++可以使用該VAR提供類似的東西:

#include <iostream> 

#ifdef COMPILE_VERSION_1 
std::string x="Version1"; 
#endif 

#ifdef COMPILE_VERSION_2 
std::string x="Version2"; 
#endif 

int main() 
{ 
    std::cout << x << std::endl; 
}