【问题标题】:Is it still considered bad practice not to separate header from implementation?不将标头与实现分开是否仍然被认为是不好的做法?
【发布时间】:2013-07-23 01:26:15
【问题描述】:

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

例子:

// File: myUtilLib.hpp

void myFunc1() {
  doSomething...
}

void myFunc2() {
  doSomething else...
}

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

【问题讨论】:

  • 几乎所有其他语言都没有缓慢的标题包含系统。我个人不能等到模块整理好。然后当它不在标题中时,您实际上可以隐藏实现。
  • 最大的缺点是编译速度较慢和违反单一定义规则(可以用inline关键字覆盖)。

标签: c++ c header


【解决方案1】:

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

这是通过在函数定义之前结合编写inline(或constexpr,它们是隐式内联的)关键字来覆盖单一定义规则的,该规则指出两个文件在编译期间不能包含相同的符号由于链接器错误。尽管inline 关键字实际上并没有强制 内联,但这会导致“过度内联”。类及其方法也是隐式内联的(如果您在标题中定义它们),因此不必将关键字放在它们上面。

仅使用标头的方法有明显的缺点,最明显的是编译时间增加以及您的代码有多个定义在运行。然而,最简单的专业人士将是您只需扑通一下标题,就可以更轻松地为您和可能的用户进行设置。这是您必须自己做出的设计决定。

但请注意,在某些情况下,仅标头方法是 only 方法,这与模板化代码有关。有一个建议让 C++ 最终获得modules,这有望使构建系统不那么痛苦。然而,它还没有被完全接受,但它的重要性似乎很高。

【讨论】:

    【解决方案2】:

    这有几个方面。

    首先,函数必须是inline 或者在整个程序中只包含一次,否则会出错。如果函数很大,并且编译器决定制作一个“异常”副本,它可能仍会多次包含在主可执行文件中,从而导致代码超出必要的范围。

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

    第三,如果函数非常大,而且它们是成员函数,包含在类定义中,那么很难很好地了解类的内容。

    另一方面,将所有东西都放在一个地方很方便,因此尽管存在上述缺点,但仍有人坚持坚持下去。但是,我个人认为这还不够。最终,文件变得足够大以至于它们无论如何都变得笨拙,因此您开始拆分它。

    【讨论】:

      【解决方案3】:

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

      (除非你的所有函数都定义为inline,但这是一种不寻常的情况。)

      如果多个.cpp 文件的标题为#include,则由于myFunc1myFunc2 的多个定义,您将遇到链接时错误。

      【讨论】:

      • 呃.. 如果写成 inline 就不行。仅标题库确实存在,并且它们确实有效。所以-1。
      • @yes123,这不是 ODR 的问题。每个 TU 都有自己的副本。
      • 不仅每个 TU 都有自己的副本,而且整个程序最终会得到几个相同的代码副本,即使是智能链接器也可能无法清理。
      • @yes123:宏一般不会解决问题。除了inline 函数,您需要在整个程序中对每个函数都有一个定义(可以包含多个源文件)。但是您希望在使用该函数的每个翻译单元(源文件)中都有一份一致的 声明 副本。这样做的方法是将你的函数定义放在.c.cpp 文件中,并在.h 文件中用include guards 声明它们。
      • 有时应该是,有时应该不是。说是:通常你应该将标题与实现分开,因为@KeithThompson 说有多个定义。说不:如果你写c++模板,你不应该把头和实现分开,因为很多编译器没有export关键字。
      猜你喜欢
      • 2017-12-18
      • 1970-01-01
      • 1970-01-01
      • 2012-11-25
      • 2012-01-05
      • 2018-08-11
      • 2015-07-24
      • 1970-01-01
      相关资源
      最近更新 更多