将新的成员函数添加到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文件而不是标题中指定.上面的例子是专注于二进制兼容性问题.
不,不是的.
您应该了解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兼容的最佳方法.