是否仍然认为不将标题与实现分开是不好的做法?

时间:2013-07-23 01:26:15

标签: c++ c header

除了C和C ++之外,几乎所有语言都不会将标题与实现分开。将函数/方法的实现放在头文件中仍然被认为是一种不好的做法,所以你不需要将它们分开吗?

示例:

// File: myUtilLib.hpp

void myFunc1() {
  doSomething...
}

void myFunc2() {
  doSomething else...
}

而是必须在单独的.cpp文件中复制/粘贴所有声明?

3 个答案:

答案 0 :(得分:7)

仅限标题库不被视为“坏”练习或“好”练习,它们是作为作者必须考虑其优缺点的设计决策。多个库确实使用仅限标头的方法,并且它们在业界广泛使用,例如Boost。

这是通过在函数定义之前写入inline(或constexpr(隐式内联)关键字来覆盖单定义规则来完成的,该定义规则指出两个文件不能包含由于链接器错误,编译期间的符号相同。尽管inline关键字实际上并非强制内联,但这会导致“过度内联”。类和它们的方法也是隐式内联的(如果你在头文件中定义它们),所以不必将关键字放在那些上。

仅限标头方法存在明显的缺点,最明显的是编译时间增加以及您运行的代码有多个定义。然而,最简单的专业是你可以只是把标题放在一边,它会更容易为你和可能的用户设置。这是一个你必须自己承担的设计决定。

请注意,有些情况下,仅限标题的方法是方法,这与模板化代码有关。有一个C ++的提议最终得到modules,它承诺使构建系统不那么痛苦。然而,它尚未被完全接受,但在重要性方面似乎取得了很大进展。

答案 1 :(得分:3)

这方面有几个方面。

首先,函数HAS为inline或仅在整个程序中包含一次,否则您将收到错误。如果函数很大,并且编译器决定进行“脱节”复制,它仍可能在主可执行文件中被多次包含,从而导致大于必要的代码。

其次,如果你继续这样做,编译磁贴会受到影响,因为同一个函数被多次编译。

第三,如果函数非常大,并且它们是包含在类定义中的成员函数,那么很难对类内容进行良好的概述。

另一方面,将所有东西放在一个地方很方便,所以尽管存在上述缺点,仍有争议仍然坚持不懈。但是,我个人并不认为这是一个好处。最终,文件变得足够大,无论如何它们都很笨重,所以你开始拆分它。

答案 2 :(得分:1)

将实现放在标题中不仅仅是不好的做法,它在大多数情况下都不起作用。

(除非您的所有功能都定义为inline,但这是一个不常见的情况。)

如果多个.cpp文件的标头有#include,则由于myFunc1myFunc2的多个定义,您会遇到链接时错误