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