我目前有一个用 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/