5

将新成员函数添加到 d 指针类定义中会破坏二进制兼容性吗?

例如,与原始定义相比,下面的新定义会破坏二进制兼容性吗?(附带问题,是否有工具可以告诉我新的 .so 与旧的 .so 相比是否会破坏二进制兼容性?如果没有,我该如何手动检查?)

原来的:

#ifndef __TESTBC_H__
#define __TESTBC_H__
class APrivate;

class A
{
  public:
   int get() { d->update(); return _d->get(); }

private:
   APrivate *_d;

};

class APrivate
{
  public:
   int get() { return _val; }
   void update() { _val = 1; }

  private:
   int _val;
};
#endif

新的:

#ifndef __TESTBC_H__
#define __TESTBC_H__
class APrivate;

class A
{
  public:
   int get() { _d->update(); return _d->get(); }

private:
   APrivate *_d;

};

class APrivate
{
  public:
   int get() { return _val; }
   void update() { _val = 1; multiply(); }
   void multiply() { _val = _val * 10; }

  private:
   int _val;
};
#endif

仅供参考:我知道 d 指针类应该在 cc 文件而不是标题中指定。上面的示例旨在关注二进制兼容性问题。

4

2 回答 2

6

不,不是的。

您应该了解 C++ 如何构建其对象。

在您的情况下,它几乎是具有非虚拟成员函数的“POD”类。这些函数不影响对象在内存中的表示。因此,新版本与旧版本二进制兼容。

更重要的是,如果您不向用户公开您的“Aprivate”类。(没有给出标题只是前向声明),即使您进行了更大的更改,您也不会破坏 API。

意义:

#ifndef YOUR_PUBLIC_API
#define YOUR_PUBLIC_API
class bar;
class foo {
public:
    // member functions using bar
private:
    bar *bar_;
};
#endif

你甚至不暴露bar,所以你可以以任何你想要的方式改变它。这是使 C++ 库 ABI 兼容的最佳方式。

于 2009-03-11T20:23:56.523 回答
1

考虑使用abi-compliance-checker工具,它检查头文件和共享库并搜索可能破坏二进制兼容性的 ABI 更改。

于 2009-08-07T20:53:52.893 回答