我正在设计用于C++库的API,该API将分布在dll/共享对象中。该库包含具有虚函数的多态类。我担心如果将这些虚拟函数公开在DLL API上,那么我就无法使用更多的虚拟函数扩展相同的类,而又不会破坏与为该库的先前版本构建的应用程序的二进制兼容性。

一种选择是使用PImpl惯用法来隐藏所有具有虚拟功能的类,但这似乎也有其局限性:这样,应用程序就失去了子类化库类和覆盖虚拟方法的可能性。

您将如何设计可以在应用程序中子类化的API类,而又不失去在新版本的dll中使用(不是抽象的)虚拟方法扩展API的可能性,同时又保持向后二进制兼容?

更新:该库的目标平台是Windows/msvc和linux/gcc。

最佳答案

几个月前,我写了一篇名为“在GNU/Linux系统上用C++实现的共享库的二进制兼容性” [pdf]。尽管Windows系统上的概念相似,但我敢肯定它们并不完全相同。但是,阅读本文后,您可以了解C++二进制级别上发生的情况,这与兼容性有关。

顺便说一下,在标准文档草案Itanium ABI中总结了GCC应用程序二进制接口(interface),因此您将为选择的编码标准奠定正式基础。

举个简单的例子:在GCC中,如果没有其他类继承该类,则可以使用更多虚函数扩展该类。阅读文章以获得更好的规则集。

但是无论如何,规则有时过于复杂以至于无法理解。因此,您可能对验证两个给定版本的兼容性的工具感兴趣:Linux的abi-compliance-checker

关于c++ - 如何设计C++ API以实现二进制兼容的可扩展性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1774911/

10-13 08:28