C++ 如何使用C+中的#ifdef在生产代码中编写纯测试代码+;?

C++ 如何使用C+中的#ifdef在生产代码中编写纯测试代码+;?,c++,testing,preprocessor,compiler-directives,C++,Testing,Preprocessor,Compiler Directives,注意:我认为这是非常基本的,如果已经回答了,请给我指出正确的方向。我确实在网上查过,但令人惊讶的是,我找不到答案,我可能用错了词来搜索 我觉得我应该能够通过在项目属性中定义预处理器指令来完成,但我相信我缺少一些基本的东西 下面是我想要完成的任务——假设我有一些类似于以下的代码,可以发布到生产环境中: //In Foo.hpp class Foo { public: Foo() ~Foo() ... } //In Foo.cpp Foo::Foo() {

注意:我认为这是非常基本的,如果已经回答了,请给我指出正确的方向。我确实在网上查过,但令人惊讶的是,我找不到答案,我可能用错了词来搜索

我觉得我应该能够通过在项目属性中定义预处理器指令来完成,但我相信我缺少一些基本的东西

下面是我想要完成的任务——假设我有一些类似于以下的代码,可以发布到生产环境中:

//In Foo.hpp
class Foo
{
   public:
      Foo()
      ~Foo()
      ...
}

//In Foo.cpp
Foo::Foo()
{
   #ifdef THIS_IS_TEST_MODE
      BarTest();
   #else
      Bar();
   #elseif
}
目标:在Foo()的构造函数中,我希望BarTest()仅在测试代码中实例化Foo时运行

上下文:我在使用BOOST,所以我基本上在测试代码中使用BOOST\u AUTO\u TEST\u套件和BOOST\u FIXTURE\u TEST\u CASE宏。有一个.props文件当前包含在所有产品和测试项目文件中

我已经尝试过的:添加了另一个带有预处理器指令测试的.props文件,并仅在测试项目中包含此.props文件。虽然#ifdef TEST在测试项目中的计算结果为true,但在生产代码中的计算结果为false。我认为这是因为新的.props配置只适用于测试项目


备选方案:我想我可以添加一个参数,比如说,
bool test
到Foo的ctor中,并将其默认为false,这样它只能在测试代码中为true。但是,我觉得这可能会在将来导致bug。

关于如何做到这一点,没有通用的规则或法律。测试套件是高度特定于应用程序的,每个应用程序都需要一种不同的定制方法来编写测试套件。谢谢Sam:)可能是我正在寻找的一种方法,它可以定义一个全局应用的指令,但只能在生成测试项目时使用。如果您希望宏能够像您描述的那样工作,然后,在编译时,它需要在每个编译单元中以相同的方式显式定义。您不能在定义了
此测试模式的情况下构建“测试代码”,而在未定义了
此测试模式的情况下构建“生产代码”,并期望两者的行为一致。宏是在编译的早期阶段展开的,在一个编译单元中定义
这是测试模式
,不会神奇地导致另一个编译单元中的代码被定义为已定义。谢谢Peter。我认为我真正需要的是只有在构建测试项目时才定义THIS_is_TEST_模式。我理解,当定义它时,测试代码和生产代码都是如此:)