更改接口类二进制文件中的私有成员变量的指针类型是否兼容?

时间:2019-10-07 07:57:35

标签: c++ pimpl-idiom binary-compatibility

class Type1;
class Type2;
class __declspec(dllexport) Foo
{
  public:
    Foo();

  private:
  Type1 * m_p1;
  Type2 * m_p2;
};

是否可以在不破坏二进制兼容性的情况下将Type1替换为Type3

背景:不幸的是,此类不使用pimpl惯用语。为了解决这个问题,我想用一个pimpl-pointer替换指针m_p1

使用Visual Studio 2010,Windows 7和10。

1 个答案:

答案 0 :(得分:2)

从提供的代码示例中,无法在调用方访问m_p2

即使那样,这还是非常违反ABI技术的说法。

但是,如果假设成立(100%确保m_p2不会以某种方式暴露出来),那么ABI只有在更改所指向的类型可以更改类的布局的情况下才会中断。

这似乎有些奇怪-即使无法在c ++语言级别上确保担保人。

因此,需要检查是否针对特定设置在两个版本之间进行了布局更改。可以用类似的东西来检查:

Foo* p = 0;
&p.m_p1;//offset to m_p1 (make a static member function for the check itself)

由于Foo上没有虚函数,因此很幸运,我们不必为此类担心-否则也应该进行测试以确保绝对正确。

唯一剩下的就是可以保留的任何可能的名称-当然仍然无法更改-但其本身不应该破坏ABI。