提问者:小点点

根据预处理器指令允许使用成员变量


请考虑以下类:

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在由多个项目使用的头中声明时,我们会遇到各种棘手的问题,其中预处理器定义不同:
fooy的偏移量会不同,从而导致对foo对象的外观有不同的解释。

问题:
是否有某种方法可以让我为使用foo的任何人声明x,但当我尝试使用它而不定义condition时,仍然会收到某种编译器警告/错误?


共2个答案

匿名用户

你想要的是ODR违规。 clean将使condition成为bool模板参数。

但是如果你冒这个险,你可以以约简形式来承担,仅在属性上有x的差异:

class Foo 
{
    #ifndef CONDITION
    [[deprecated("Don'u use with [[condition]] defined")]]
    #endif
    int x = 0;
    int y;

}

匿名用户

不要使标头中可见的定义以宏定义为条件。

如果您需要有条件地添加不同的成员,那么您必须向类的用户隐藏那些成员。 这可以通过PIMPL模式实现。

相关问题