除了 C 和 C++ 之外,几乎所有语言都不会将标头与实现分开。将函数/方法的实现放在头文件中是否仍然被认为是一种不好的做法,因此您不需要将两者分开?
例子:
// File: myUtilLib.hpp
void myFunc1() {
doSomething...
}
void myFunc2() {
doSomething else...
}
而是必须将所有声明复制/粘贴到单独的.cpp
文件中?
仅标头库不被视为“坏”实践或“好”实践,它们是您作为作家必须考虑其优缺点的设计决策。多个库确实使用仅标头方法,并且它们在行业中被广泛使用,例如 Boost。
这是通过在函数定义之前结合编写inline
(或constexpr
,它们是隐式内联的)关键字来覆盖单定义规则来完成的,该规则指出两个文件在编译期间由于链接器错误而不能包含相同的符号。尽管inline
关键字实际上并不强制内联,但这会导致“过度内联” 。类及其方法也是隐式内联的(如果您在标题中定义它们),因此不必将关键字放在那些上面。
仅标头方法有明显的缺点,最明显的是编译时间增加以及您有多个运行代码定义的事实。然而,最简单的专业人士将是您只需扑通一下标题,就可以更轻松地为您和可能的用户进行设置。这是您必须自己承担的设计决定。
但是请注意,在某些情况下,仅标头方法是唯一的方法,这与模板代码有关。有一个建议 C++ 最终获得承诺使构建系统不那么痛苦的模块。然而,它尚未被完全接受,但在重要性尺度上似乎取得了很高的进展。
这有几个方面。
首先,该函数必须inline
或仅在整个程序中包含一次,否则会出错。如果函数很大,并且编译器决定制作一个“不合规”的副本,它可能仍会多次包含在主可执行文件中,从而导致代码超出必要的范围。
其次,如果你继续这样做,编译 tile 会受到影响,因为同一个函数会被编译多次。
第三,如果函数非常大,而且它们是成员函数,包含在类定义中,那么很难很好地了解类的内容。
另一方面,将所有东西都放在一个地方很方便,因此尽管存在上述缺点,但仍然有坚持不懈的理由。但是,我个人认为这还不够。最终,文件变得足够大以至于它们无论如何都难以处理,因此您开始拆分它。
将实现放在标题中不仅是不好的做法,而且在大多数情况下都不起作用。
(除非您的所有函数都定义为inline
,但这是一种不寻常的情况。)
如果一个以上的.cpp
文件有一个用于您的标头,那么由于和 的多个定义,#include
您将遇到链接时错误。myFunc1
myFunc2