我很难理解关于内联和客户二进制兼容性的句子。有人可以解释一下吗?
C ++常见问题解答Cline,Lowow:
当编译器合成副本构造函数时,它将使其内联。如果您的类向客户公开(例如,如果您的客户#包括您的头文件,而不是仅使用根据您的类构建的可执行文件),则将内联代码复制到客户的可执行文件中。如果客户希望在头文件的发行版之间保持二进制兼容性,则不得更改客户可见的内联函数。因此,您需要复制构造函数的显式非内联版本,该版本将直接由客户使用。
动态库(.dll
,.so
)的二进制兼容性通常很重要。
例如,您不需要在OS上重新编译一半的软件,因为您以某种不兼容的方式更新了所有底层库(并考虑了安全更新的频率)。即使您愿意,通常您甚至可能甚至没有所需的全部源代码。
为了使动态库的更新兼容并产生效果,您基本上不能更改公共头文件中的任何内容,因为其中的所有内容都直接编译为其他二进制文件(即使在C代码中,通常可以包括结构大小)和成员布局,显然您也不能删除或更改任何函数声明)。
除了C问题之外,C ++还引入了更多内容(虚拟函数的顺序,继承的工作方式等),因此可以想象,您可以做一些更改自动生成的C ++构造函数,复制,析构函数等的操作,同时还要保持兼容性。如果它们是与类/结构一起“内联”定义的,而不是在源代码中显式定义的,则它们将被链接到动态库并使用这些自动生成的函数的其他应用程序/库直接包含在内,并且它们不会使您获得更改了版本(您甚至可能没有意识到已更改!)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句