c++ - 使用 CPP 标志从一个源文件创建多个目标文件

标签 c++ c-preprocessor

我目前有一个用 C++ 定义的类,其中包含一个 C 预处理器变量来打开/关闭某个功能:

A.hh

class A : public B {
  //...
#ifdef PPVAR
  int _i;
#endif

public: 
  A();
  //...
};

A.cc

A::A()
#ifdef PPVAR
  : B(1)
#else
  : B(2)
#endif
  {}

影响成员变量和父类(super class)的初始化。目前,我通过在我的 C++ 编译器标志中包含/排除“-DPPVAR”来切换案例。但是,更希望同时可以使用这两种实现。 原则上我可以复制这些源文件(A_on.[hh,cc]、A_off.[hh,cc]),但由于它们有很多共同点,这看起来很不雅。因为标志会影响父类(super class)的成员和构造函数,所以我看不到通过简单地引入例如全局变量 bool switchFeature = [T|F] 来控制此功能的简单方法。并使用

if (switchFeature) {
  //...
} else {
 //...
}

无处不在。如果这是可能的,这将是我的选择方法,我很想听听您对此的解决方案!

作为替代方案(虽然类的数量加倍)我想也许有人可以编译这个源代码两次,一次使用“-DPPVAR”,一次不使用并生成两个目标文件 A_on.o,A_off.o,但不知何故我会仍然需要复制我的 header 才能使其正常工作,并且需要对其余代码进行更多修改。

对于如何解决这个问题的任何见解和提示,我将不胜感激

最佳答案

int 中创建您的类 A 模板。

template<int PPVAR_val = 1>
class A : public B {
  //number of members can also differ for partial specializations
  int _i;

public: 
  A();
  //...
};

A.cpp

template<int PPVAR_val>
A::A()
  : B(PPVAR_val)
  {}

关于c++ - 使用 CPP 标志从一个源文件创建多个目标文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23650537/

相关文章:

c++ - 使用预处理指令检查是否包含 header ?

c++ - 当没有传递任何参数时,#__VA_ARGS__ 应该生成什么?

c++ - 带有命令行参数的 C++ Makefile 和 Bash 脚本

c - 预处理器指令中令人困惑的术语

c++ - 尝试在 Visual Studio 2010 中编译 Tessnet2 (Visual Studio 2008 C++) 项目

c++ - 没有括号的 if 语句是否更快?

objective-c - Objective-C 字符串文字的预处理器宏值

c++ - "#define new DEBUG_NEW"和 "#undef THIS_FILE"等真的有必要吗?

c++ - 左移循环公式

c++ - 如何使用 std::multimap 将整数键映射到用作多维数组坐标的两个整数值(对于 Tic Tac Toe)?