在 C++ 中,该库可以仅以标头格式分发。我想知道是否可以将每个库转换为仅标头库?或相反亦然?应该使用什么标准来决定我是否应该在仅标题下分发库?除了必须重新编译仅标头库之外,还有其他可能影响决定的考虑因素吗?“内联”如何在仅标头库中发挥重要作用?
谢谢,
在 C++ 中,该库可以仅以标头格式分发。我想知道是否可以将每个库转换为仅标头库?或相反亦然?应该使用什么标准来决定我是否应该在仅标题下分发库?除了必须重新编译仅标头库之外,还有其他可能影响决定的考虑因素吗?“内联”如何在仅标头库中发挥重要作用?
谢谢,
通常,标题中的任何内容都被视为内联。这对某些库可能是有利的,但通常应慎重使用。在标头中放置过多的逻辑可能会导致一些不良后果:客户端代码的相互依赖、如果逻辑发生更改则编译时间长、由于过度使用内联导致代码膨胀等。其中一些问题可以通过良好的优化编译器来缓解。一般来说,我建议不要将复杂的逻辑放在内联函数中,因此放在头文件中,因为它是导致大多数这些问题的原因。
至于反过来,是的,大多数作为标头分发的库都可以转换为更传统的库。严重依赖模板代码的库除外,因为这通常在编译时进行解释。
关于标准,我会说如果代码被大量模板化和/或主要由简单的函数组成,那么头库将是一个可以接受的选择。否则,普通库几乎绝对是更好的选择。
简而言之,如果您对发布所有源代码感到满意,是的。
但是还有很多其他的事情。例如,如果分发了对库的更新,则动态链接库将使用最新版本,但只需重新编译标头即可。此外,另一个很大的区别是代码优化。当编译器可以访问源代码时,它可以针对特定情况生成更好的程序集。
最后但并非最不重要的一点是,使用动态链接,您必须将其安装在库目录中,但只有头文件才能使您的程序独立。
这取决于库是否可以将其转换为仅标题。相反,任何库都可以从仅标头转换为传统的标头+源。您真的想问自己为什么只需要标题?你希望获得或实现什么?
仅将库作为标头分发可能会在库更改时引起问题。可以说有一个不会修改界面的小改动。而不是重新编译库,每个使用它的应用程序都必须重新编译。使用静态库,用户应用程序只需重新链接即可。使用共享库,它们不必重新编译或重新链接。
您还可能会遇到问题,即使用您的库的每个组件都必须使用相同的编译器和链接器版本并以类似方式构建(即相同的 CRT 链接、优化等),以便在彼此之间与库对象进行通信。但这在很大程度上可以通过某些设计选择来解决。
关于“内联”,所有内容本质上都与仅标题库内联。