0

考虑以下类:

class Foo 
{
public:
    #ifdef CONDITION
    int x = 0;
    #endif

    int y;

    int foo() { 
        #ifdef CONDITION
        return ++x;
        #else
        return 0;
        #endif
    }
}

int x仅在我定义时存在CONDITION- 通过 a#define CONDITION或作为预处理器定义 ( -D CONDITION)

这有一个很好的优势,即我无法编译我在未定义x的地方错误地使用它。CONDITION

例如:如果我不小心写了如下内容:

Foo f;
f.x = 10;

当我失踪时,这将不允许编译-D CONDITION

Foo但是,当在多个项目使用的头文件中声明类时,我们会遇到各种令人讨厌的问题,其中预处理器定义不同: within
的偏移量将不同,导致对对象外观的不同解释。yFooFoo

问题:
有什么方法可以让x任何人使用Foo.CONDITION

4

2 回答 2

1

您想要的是违反 ODR。一种更简洁的方法是制作CONDITION模板bool参数。

但是如果你冒这个风险,你可以用简化的形式来接受它,x只有属性上的区别:

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

}
于 2020-07-20T13:51:44.783 回答
1

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

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

于 2020-07-20T13:43:35.183 回答