【问题标题】:Should I always split my files into declarations (.h) and definitions (.cpp)我是否应该始终将文件拆分为声明 (.h) 和定义 (.cpp)
【发布时间】:2013-07-15 20:22:27
【问题描述】:

为了使某些代码更易于阅读,我将其拆分为多个文件。其中一个文件只包含 2 种初始化方法。是否值得创建一个 .h 并在其中包含这些方法的声明,或者我应该直接包含 .cpp,仅包含 2 个方法,是否值得遵守标准?

【问题讨论】:

  • 永远不要包含 .cpp 文件。绝不。永远。
  • @H2CO3 够公平的。为什么不呢,我已经在一些例子中看到过? (不是说是对的,只是想解释一下为什么不对)。
  • ld: 1 duplicate symbol for architecture x86_64
  • .h.cpp 之间拆分文件没有硬性规定。我通常使用模板并制​​作仅标头库,因此我将所有内容都保存在 .h 文件中。
  • @handuel 您无法使用预处理器指令解决链接时错误,因为翻译单元是独立处理的。

标签: c++ split


【解决方案1】:

你永远不应该包含 cpp 文件,无论其中包含多少定义:包含在其他几个 cpp 文件中的每个定义都会产生重复的符号,从而导致链接错误。

如果您构建一个在多个翻译单元中使用的类(这是 cpp 文件的一个花哨名称),您应该为它构建一个标题。模板没有 cpp 文件 - 只需要一个标题。

虽然通常的做法是为每个类制作一个 cpp/header 对,但可以在一个翻译单元中包含多个相关的类,并将所有声明放在一个头中。

【讨论】:

  • 编译器不会阻止您在头文件中添加多个相关类,但要小心!我有一个项目对我来说非常大,最终发现很难定位与数学库相关的课程。即使它们都是相关的,如果我实际上将它们分开并保持 1:1 标题/翻译单元范式,我会花更少的时间搜索东西。
  • @DJPeterson 我同意,在标题中粘贴多个类应该是一个例外,而不是规则。大约只有一次我会考虑它是紧耦合项的“集群”的类,例如,一个类及其friend 比较器。这种情况在 C++11 中应该不太常见。
【解决方案2】:

如前所述,您不包含 .cpp 文件。如果项目周围需要您的代码,那么标题是必须的。但是,您也可以随时使用 extern。 http://www.cplusplus.com/forum/general/21368/

【讨论】:

    【解决方案3】:

    您包含的.cpp 文件一个错误命名的.h 文件。

    .cpp.h 是对程序员有意义的扩展(以及工具链中偶尔出现的工具)。如果你开始 #includeing .cpp 文件,即使你说服你的工具链如何处理它,你也会让其他程序员(包括几个月/几年后的你自己)感到困惑。

    有时可以接受创建仅包含一组工具或功能的头文件。调用该文件.cpp 不是。

    【讨论】:

      猜你喜欢
      • 2015-09-15
      • 1970-01-01
      • 2020-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-17
      • 1970-01-01
      相关资源
      最近更新 更多