将新成员函数添加到d指针类中断二进制兼容性?

时间:2009-03-11 20:02:37

标签: c++ api-design binary-compatibility d-pointer

将新的成员函数添加到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

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

2 个答案:

答案 0 :(得分:5)

不,不。

您应该了解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兼容的最佳方法。

答案 1 :(得分:1)

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

相关问题