【问题标题】:C++ : Best place to include header filesC++:包含头文件的最佳位置
【发布时间】:2012-05-02 22:43:19
【问题描述】:

假设我们有四个文件:a.h、a.cpp、b1.h 和 b2.h。而且,我们需要在 a.h 或 a.cpp 中包含 b1.h 和 b2.h。我应该在哪里包括 b1 和 b2?假设只有 a.cpp 需要 b1 和 b2。

【问题讨论】:

  • 如果只有 a.cpp 需要 b1 和 b2,那么,将它们包含在 a.cpp 中。

标签: c++ header


【解决方案1】:

如果头文件不需要,则将其包含在 cpp 中。

这减少了编译时间并有助于理解模块之间的依赖关系。

【讨论】:

    【解决方案2】:

    一般规则是,您应该避免在不使用其中定义的标头中包含标头。

    【讨论】:

      【解决方案3】:

      如果 b1.h 和/或 b2.h 具有 structtypedef 等定义,这些定义实际上在 a.h 中使用(在函数原型中作为参数或返回类型,例如),那么您应该将它们包含在标题的顶部。

      否则,如果 b1.h/b2.h 仅提供在 a.cpp 内部使用的定义(私有成员等),则将其包含在 a.cpp 的顶部。

      您应该尝试仅在文件中包含编译器理解该文件所需的内容。 (与 windows 不同,具有 <Windows.h> 的怪物。)

      【讨论】:

        【解决方案4】:

        只在标题中包含需要的内容。

        a.h的类定义和函数声明需要b1.h还是b2.h? 然后包括需要的内容。

        否则只包含在 .cpp 中。

        请记住,每次包含文件时,编译所需的时间都会更长。

        以下是一些关于何时需要的提示:

        • 不需要包含返回值或参数。 例如std::string blahFunc(std::string a); 不需要在头文件中包含<string>(但仍然需要前向声明)

        • 不需要包含指针类型,它们只需要前向声明即可。例如randomType * f(); 不需要在其标头中包含随机类型的标头。您所要做的就是通过class randomType;进行转发声明

        • 也可以只前向声明引用。

        【讨论】:

          【解决方案5】:

          我认为包含指令应该始终在您的 .h** 文件中。您应该放入 a.cpp 文件中的唯一包含应该是

          #include "a.hpp"
          

          为了理解原因,假设 Bob 在他的程序中使用了您的代码,并且您的代码没有被公开(即,您仅将其作为库提供)。那么他只能看到你的标题。如果您在标头中包含您需要的所有内容,他仍然能够检查您的代码的依赖关系并确保他拥有您的代码所需的所有内容。如果您将包含指令放在 .c** 文件中,那么除非您的代码是开源的(即他可以访问 .c** 文件),否则他将无法看到他必须确保的包是什么已安装。

          【讨论】:

          • 这会公开实现细节。假设我正在编写 MyClass,而这周我决定它在内部使用 Widgets,所以我在公共标头中#include Widgets。下周我意识到使用 Gadgets 实现更好,所以我必须切换到#include Gadgets。结果:坏事。用户现在有一个毫无意义的重新编译。更糟糕的是,如果他们不小心利用了我给他们的免费包含的 Widget,现在他们会得到编译错误。将其乘以几百或几千倍(即,现实世界的大规模编程),你就会陷入无法维护的混乱局面。
          • 将#includes 排除在不需要的标头之外,这只是将信息保持在尽可能小的范围内的一般原则的一个示例。
          猜你喜欢
          • 2013-03-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-21
          • 2019-01-19
          • 1970-01-01
          • 1970-01-01
          • 2014-11-26
          相关资源
          最近更新 更多