仅头文件库有哪些好处?为什么要以这种方式编写它而不是将实现放入单独的文件中?

有帮助吗?

解决方案

在某些情况下,仅包含头文件的库是唯一的选择,例如在处理模板时。

拥有纯头文件库还意味着您不必担心可能使用该库的不同平台。当您分离实现时,通常这样做是为了隐藏实现细节,并将库作为标头和库的组合进行分发(lib, dll的或 .so 文件)。当然,必须针对您提供支持的所有不同操作系统/版本进行编译。

您还可以分发实现文件,但这对用户来说意味着一个额外的步骤 - 在使用您的库之前对其进行编译。

当然,这适用于 逐案 基础。例如,仅头文件库有时会增加 代码大小& 编译时间。

其他提示

仅限标题库的好处:

  • 简化构建过程。您无需构建库,并且您无需在构建的链接步骤步骤期间指定编译的库。如果您确实有一个编译的库,则可能需要构建它的多个版本:使用调试启用的调试编译,另一个具有优化,并且可能是另一个删除的符号。并且可能更多的多平台系统。

    唯一一个图书馆的缺点:

    • 更大的目标文件。来自某些源文件中使用的库中使用的每个内联方法都将在该源文件的编译对象文件中获取弱符号,在编译的对象文件中。这减速了编译器,并减慢了链接器。编译器必须生成所有膨胀,然后链接器必须过滤它。

    • 更长的编译。除了上面提到的膨胀问题之外,编译需要更长时间,因为标题与只有编译的库的标题库固有更大。这些大标题将需要对使用库的每个源文件进行解析。另一个因素是,只有唯一的库中的那些标题文件必须由内联定义以及库所需的标题所需的标题文件以及库所需的标题作为编译的库。

    • 更加纠结的编译。由于只需使用标头库,您可以获得唯一只有唯一依赖性的依赖性库,因此只需要额外的#include。更改库中某些关键功能的实现,您可能需要重新编译整个项目。使得编译库的源文件中的更改,您必须要做的只是重新编译一个库源文件,使用该文件更新编译的库,并将其重新链接应用程序。

    • 人类更难阅读。即使使用最佳文档,库的用户也必须携带读取图书馆的标题。只有唯一库中的标题填充有实现详细信息,以了解界面的理解方式。使用编译的库,您所看到的只是界面和关于实现的简要评论,并且通常是您想要的。这真的是你想要的。您不应该知道实现详细信息以了解如何使用库。

我知道这是一个旧线,但没有人提到ABI接口或具体编译器的问题。所以我想我会的。

这基本上是根据该概念,你无论编写一个图书馆与一个标题来分发人或者重复使用自己vs具有一切都在头部。如果你想重复使用一个标题和来源的文件和编译这些在每一个项目,那么,这并不真正适用。

基本上如果你汇编C++编码,并建立一个图书馆与一个编译器,然后用户试图使用,图书馆与一个不同的编译器或不同的版本相同的编译器然后你可以得到接头的错误或奇怪的运行时行为,因为二进制的不相容性。

例如编译器供应商常常改变其执行情况的STL之间的版本。如果你有一个功能在一个图书馆,接受一个性病::矢量,然后它希望字节,在这类安排的方式,他们被安排当的库的编制。如果在一个新编译版本,供应商作出了效率,改善性病::矢量,然后用户的代码看到新的一类可能具有不同的结构和通过新的结构到你的图书馆。一切都走下坡路从那里...这就是为什么我们建议不通过STL的对象在图书馆的边界。这同样适用于C运行时间(CRT)的类型。

在谈CRT,你的图书馆和用户的来源码通常需要联系对相同的CRT。与Visual Studio如果你建立图书馆使用多线程CRT,但用户的链接针对多线程"调试"CRT然后你会有链接的问题,因为你的图书馆不可能找到符号它的需要。我不记得其它的功能是,但对于Visual Studio2015年Microsoft提出一项CRT功能的内联。突然这是在头不CRT库所以库,预计可以找到它在链接时不再可能做到这就产生了链接的错误。其结果是,这些图书馆需要重新编译Visual Studio2015年。

你也可以获得的链接的错误或奇怪行为,如果您使用的Windows API但是你建立不同Unicode设置图书馆的用户。这是因为Windows API具有的功能,它使用Unicode或ASCII strings和宏/定义,它自动地使用正确类型的基于项目的Unicode设置。如果你通过一串的跨边界图书馆,这是错误的类型,然后事情破坏在运行时间。或者你可能会发现,程序不会链接在第一位。

这些事情也是真实的,用于传递对象/类型的跨边界图书馆从其他第三方的库(e。g一个矢量特征或GSL矩阵)。如果3方图书馆改变他们的头你们之间的汇编您的图书馆和用户编写自己的代码然后事情会破裂。

基本上是安全的唯一的东西你可以通过跨边界图书馆都建立在种类和纯的旧数据(POD).理想情况下的任何POD应该在结构定义在你自己的标题并不依赖于任何第三方的标题。

如果你提供一头才库,然后所有的代码汇编与同一个编译器设定与对同样的标题,使很多这些问题消失(提供的版本第三部分图书馆,你和你的用户使用的是API兼容)。

但是有底片,上文已经提及,如增加汇编的时间。你也可以运行一个企业所以你可能不想到手的所有源代码的实施细节向所有用户情况下他们中的一个偷走了它.

主要的“福利”是它需要您提供源代码,所以 您将在机器上和您的编译器结束时结束错误报告 从未听说过。当库完全模板时,你没有 很多选择,但是当你有选择时,标题通常通常是一个穷人 工程选择。(另一方面,当然,标题仅意味着 您不必记录任何集成程序。)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top