使用CPP标志从一个源文件创建多个对象文件 我现在有一个C++类,它包含一个C预处理器变量来打开/关闭某个特征:

使用CPP标志从一个源文件创建多个对象文件 我现在有一个C++类,它包含一个C预处理器变量来打开/关闭某个特征:,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

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]),但由于它们有太多的共同点,这看起来非常不雅观。因为该标志影响超类的成员和构造函数,所以我看不到简单地通过引入全局变量
boolswitchfeature=[t | F]
并使用

if (switchFeature) {
  //...
} else {
 //...
}
到处都是。如果这是可能的,这将是我选择的方法,我希望听到你的解决办法

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


如果您能提供任何有关如何解决此问题的见解和提示,我将不胜感激。

请将您的类
变成
int
中的
模板

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

public: 
  A();
  //...
};
模板
A类:公共B类{
//部分专业化的成员数量也可能不同
int_i;
公众:
A();
//...
};
A.cpp

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

如果a与其子级之间的某些代码不同,则应为a创建一个子级并添加虚拟方法

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。

我看不出您会如何使用它。同一程序中同一类不能有两个定义(一个定义规则)。为什么您试图给两个不同的类赋予相同的名称?您可以使用相同的方法(
ifdef PPVAR
)将您的类浸入不同的名称空间中。尽管这很难看,但即使可能,这也是通向无法维护的代码的途径,请参见。@AlexT您甚至可以通过想象使用宏来破坏名称。一些获奖作品很好地利用了这一点,但我不能推荐其他任何东西。看起来您有两种不同的
B接口实现
——为什么不采用“面向对象”的方式,将这些实现隐藏在某个工厂后面呢?您也可以在这里使用CRTP,因为您实际上不需要动态polimorphism
int main(void)
{
bool PPVar = ...;
A    *a;
if (PPVar)
     a = new A();
else
     a = new A2();

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