C++ C++;,g++;,基于主机名的条件编译?

C++ C++;,g++;,基于主机名的条件编译?,c++,g++,c-preprocessor,conditional-compilation,C++,G++,C Preprocessor,Conditional Compilation,我遇到了以下问题: 我们的测试环境无法完全模拟生产环境的特定硬件部分,因此在测试应用程序时需要排除一些代码 因此,我需要某种方式的帮助 #IFNDEF testing_env //code to exclude #ENDIF 如果我包含一个#DEFINE testing_env,这就可以了,但是像这样,每次切换环境时,我都需要手动注释/取消注释这个定义 我正在寻找一种基于主机名或类似功能的方法。我曾试图寻找基于环境变量的条件编译,但显然这是不可能的。通常为测试环境创建一个特定的生成配置文

我遇到了以下问题:

我们的测试环境无法完全模拟生产环境的特定硬件部分,因此在测试应用程序时需要排除一些代码

因此,我需要某种方式的帮助

 #IFNDEF testing_env
 //code to exclude
 #ENDIF
如果我包含一个
#DEFINE testing_env
,这就可以了,但是像这样,每次切换环境时,我都需要手动注释/取消注释这个定义


我正在寻找一种基于主机名或类似功能的方法。我曾试图寻找基于环境变量的条件编译,但显然这是不可能的。

通常为测试环境创建一个特定的生成配置文件(专用生成规则),为其他环境创建另一个生成配置文件(其他生成规则)

然后可以在编译行(通常在Makefile中)使用-DTEST_环境指定测试环境,例如使用-D选项:

g++-DTEST\u环境-o test main.c

然后

#IFNDEF TEST_ENVIRONMENT
//code to exclude
#ENDIF

可以正常工作。

通常,您为测试环境创建一个特定的生成配置文件(专用生成规则),并为其他环境创建另一个生成配置文件(其他生成规则)

然后可以在编译行(通常在Makefile中)使用-DTEST_环境指定测试环境,例如使用-D选项:

g++-DTEST\u环境-o test main.c

然后

#IFNDEF TEST_ENVIRONMENT
//code to exclude
#ENDIF

将正常工作。

您的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
HOSTNAME=$(shell主机名)
ifeq($(主机名),localhost1.localdomain)
ANY_VAR=编译版本1
其他的
ANY_VAR=编译版本2
恩迪夫
$(信息$(主机名))
$(信息$(任何变量))
%.o:%.cpp
g++-D$(任意变量)$<-c
OBJECTS=main.o
转到:$(对象)
g++$^-o go
清洁:
rm-f*.o
rm-f go
您的C/C++可以将此变量与以下内容一起使用:

#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;
} 
#包括
#ifdef编译版本1
std::string x=“Version1”;
#恩迪夫
#ifdef编译版本2
std::string x=“Version2”;
#恩迪夫
int main()
{   

std::cout您的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
HOSTNAME=$(shell主机名)
ifeq($(主机名),localhost1.localdomain)
ANY_VAR=编译版本1
其他的
ANY_VAR=编译版本2
恩迪夫
$(信息$(主机名))
$(信息$(任何变量))
%.o:%.cpp
g++-D$(任意变量)$<-c
OBJECTS=main.o
转到:$(对象)
g++$^-o go
清洁:
rm-f*.o
rm-f go
您的C/C++可以将此变量与以下内容一起使用:

#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;
} 
#包括
#ifdef编译版本1
std::string x=“Version1”;
#恩迪夫
#ifdef编译版本2
std::string x=“Version2”;
#恩迪夫
int main()
{   

std::显然可以使用环境变量:为什么不将其移动到
测试运行程序级别
?运行时不运行测试取决于任何环境属性。
-D testing\u env
是否有效?我想,最简单的方法是在构建脚本中实现这一点,即生成定义(
-D
)取决于环境变量或类似的东西。您发布的链接是特定于Visual Studio的,我使用的是QtCreator和g++显然可以使用环境变量:为什么不直接将其移动到
测试运行程序级别
?运行时不运行测试取决于任何环境属性。
-D测试环境
会起作用吗?我想,最简单的方法是在构建脚本中进行此操作,即根据环境变量或类似内容进行定义(
-D
)++