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

时间:2014-05-14 09:23:01

标签: c++ c-preprocessor

我目前有一个用C ++定义的类,它包含一个C-preprocessor变量来打开/关闭某个特性:

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
  {}

影响成员变量和超类的初始化。目前,我通过在我的c ++编译器标志中包含/排除“-DPPVAR”来切换案例。但是,将两个实现同时同时更加可取。 我原则上可以复制这些源文件(A_on。[hh,cc],A_off。[hh,cc])但是因为它们有很多共同点,所以这看起来非常不优雅。因为标志会影响超类的成员和构造函数,所以我看不到通过简单地引入全局变量bool switchFeature = [T|F]和使用

来控制此功能的简单方法
if (switchFeature) {
  //...
} else {
 //...
}

everywwhere。如果这是可能的,那将是我的选择方法,我很乐意听到你的解决方案!

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

我很感激有关如何解决这个问题的任何见解和暗示

2 个答案:

答案 0 :(得分:1)

A制作您的课程int模板。

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)
  {}

答案 1 :(得分:0)

如果A与其子级

之间的某些代码不同,您应该为A创建子级并添加虚拟方法

A.hh

class A : public class B {

// Common attributes and Functions
...

protected:
A(int ppvar) : B(ppvar) {}; // Not public
public:
A() : B(1) {};

virtual method(); // Method that differ between A and its Child
...
};

class A2 : public class A {
// Attributes only needed by A2
...
public:
A2() : A(2) {};

method(); // Say that A2 will use its own implementation of method
};

main.cc

int main(void)
{
bool PPVar = ...;
A    *a;
if (PPVar)
     a = new A();
else
     a = new A2();

a->method();
return (0);
}

抽象类A,有两个孩子AOn和Aoff。