请考虑以下类:
class Foo
{
public:
#ifdef CONDITION
int x = 0;
#endif
int y;
int foo() {
#ifdef CONDITION
return ++x;
#else
return 0;
#endif
}
}
int x
仅在定义条件
时存在-通过#define condition
或作为预处理器定义(-d condition
)
这有一个很好的优点:我不能编译它,当condition
没有定义时,我在某处错误地使用了x
。
例如:如果我错误地写了这样的东西:
Foo f;
f.x = 10;
当我缺少-d条件
时,将不允许编译
但是,当类foo
在由多个项目使用的头中声明时,我们会遇到各种棘手的问题,其中预处理器定义不同:
在foo
中y
的偏移量会不同,从而导致对foo
对象的外观有不同的解释。
问题:
是否有某种方法可以让我为使用foo
的任何人声明x
,但当我尝试使用它而不定义condition
时,仍然会收到某种编译器警告/错误?
你想要的是ODR违规。 clean将使condition
成为bool
模板参数。
但是如果你冒这个险,你可以以约简形式来承担,仅在属性上有x
的差异:
class Foo
{
#ifndef CONDITION
[[deprecated("Don'u use with [[condition]] defined")]]
#endif
int x = 0;
int y;
}
不要使标头中可见的定义以宏定义为条件。
如果您需要有条件地添加不同的成员,那么您必须向类的用户隐藏那些成员。 这可以通过PIMPL模式实现。