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。
答案 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。