将新的成员函数添加到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指针类而不是标题。以上示例旨在关注二进制兼容性问题。
答案 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更改。