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

标签 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

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

最佳答案

不,它没有。

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

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

不仅如此,如果您不向用户公开您的“APrivate”类。 (不给 一个 header 只是前向声明),即使你做的更大,你也不会破坏 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 兼容的最佳方法。

关于c++ - 将新成员函数添加到 d 指针类会破坏二进制兼容性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/636110/

相关文章:

c++ - 用于存储可在 switch 中使用而无需显式转换的固定长度命名常量集合的最佳数据结构是什么?

php - Symfony 中的 API 分页

api - 如何处理 RESTful API 中的敏感属性(例如密码、信用卡等)

Scala:版本之间的二进制不兼容

c++ - 功能模板及操作

c++ - 调用 `strcat` 并能够将较大的字符串存储到较小的字符串中?

rest - 对于 REST API,URL 是否意味着不区分大小写?

com - VB6 IDE 正在锁定加载项目的 DLL

自定义 "non-traditional"多态性实现

c++ - 通过数组漏洞覆盖数据