我想要的是一些类成员有时是私有(private)
,有时是公共(public)
。这些成员应该可以被某些模块访问,而不能被其他模块访问。
对此类进行成像:
class Foo {
public:
...
private:
...
protected:
...
internal:
int x;
};
在模块 X 中,内部
定义为:
#define internal public
在模块 Y 中定义为:
#define internal private
所以真正的问题是这个技巧是否可以被标准接受,或者它是否会以任何方式改变类(或其成员)的签名。
我知道 friend
和 PIMPL
适合这种工作,但是 friend
可能会变得非常困惑,并且 PIMPL
> 的性能(间接以及无法内联的事实)对于我正在处理的代码库来说是 Not Acceptable 。
最佳答案
这是一个 ODR违反并因此引发未定义的行为。 (另请参见 basic.def.odr]/6.1“D 的每个定义应包含相同的标记序列”)。
但是,常见的实现是 public、private、protected 对类布局没有影响,因此它可以工作。
你如履薄冰;没有什么可以阻止编译器将所有公共(public)成员放在第一位,然后是 protected 成员,然后是私有(private)成员。更重要的是,一般来说,声明的顺序需要是内存中的顺序,所以
struct T {char a; int b; char c};
需要先有a
,然后是b
,然后是c
。这是为了确保 C 兼容性。然而,对具有不同访问权限的元素的排序没有要求(参见 [class.mem]/9.2 p13:“具有相同访问控制(第 11 条)的(非 union )类的非静态数据成员被分配,以便后面的成员在类对象中具有更高的地址。具有不同访问控制的非静态数据成员的分配顺序未指定(第 11 条)”。因此给出
struct T {char a; int b; private: char c};
编译器可以对成员重新排序,并将 c
放在 a
和 b
之间的间隙中。
最后说明EJP以及其他认为这些是声明而不是定义的人:我在上面给出了 T
的两个定义; 声明看起来像struct T;
。
编辑:感谢 Fanael引用标准。
关于c++ - 私有(private)/ protected /公共(public)如何影响 ABI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45981306/