凝聚声明和实施到一个HPP文件
我已经阅读了一些关于在C ++中保留头文件的需求/适用性/实用性的文章,但是我似乎无法找到任何地方为什么/何时应该或者何时应该完成上述内容的坚实原因。 我知道boost使用.hpp文件为最终用户提供模板功能,而不需要关联的.cpp文件,而这种想法部分来源于浏览代码。 看起来,这将是一种方便的方式来提供单个文件模块,例如新的Wt或Qt小部件(仍然坚持每个.h约定的一个类)。
然而,是否有任何负面的技术实现可以让某个单独的.hpp文件同时拥有头文件声明和实现,假设你在访问实现时没有问题(比如在OSS环境中)。 从编译器/链接器的角度来看,它是否有任何负面影响?
任何意见或观点,将不胜感激。
我知道boost使用.hpp文件来为最终用户提供模板功能,而不需要关联的.cpp文件
错误的动词:它不是“没有必要”,它是“没有能力 ”。
如果Boost可以,他们会将他们的库分成头文件和实现文件。 事实上,他们尽可能地这样做。
干净分离的原因很简单:只有头文件的项目的编译时间大大增加,因为每次重新编译应用程序的最小部分时,都必须读取,分析和编译相关的头文件。
如果您碰巧重新编译特定的目标文件,则只需编译实现文件。
大型C和/或C ++项目需要数小时才能编译。 这些对标题和对象文件使用干净的分隔。 如果他们只使用头文件,我敢打赌,编译时间将以天而不是小时来衡量。
但是对于Boost的许多库来说,事实是模板定义可能不在其声明的单独编译单元中,所以这是不可能的。
.hpp-only库的主要负面方面是它们不能引用预编译模块。 所有存在于.hpp中的代码以及库中的所有代码都必须添加到您的应用程序中。 这会增加二进制文件的大小,并在不止一次使用该库的系统上创建冗余二进制文件。
有了模板,你就没有真正的选择。 理论上, export
允许你将接口与实现分开,但只有一个编译器(Comeau)真的支持this1,并且它将从C ++ 0x中删除。
无论如何,试图将非模板函数的实现放入标题中会导致一个明显的问题:一个定义规则仍然有效,因此如果在多个翻译单元中定义相同的函数,则会出现问题。 链接器通常会给出一个错误,说明同一个符号已被定义多于一个。
1虽然EDG编译器的前端实际上支持它,但其他基于EDG的编译器(例如英特尔)也支持某种程度的export
,尽管它们没有对其进行记录,所以您不能太依赖它们。
上一篇: Condensing Declaration and Implementation into an HPP file