C ++:包含头文件的最佳位置

时间:2012-05-02 22:43:19

标签: c++ header

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

5 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:0)

仅包含标题中所需的内容。

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

否则只包含在.cpp。

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

这里有一些关于什么时候需要的提示:

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

  • 不需要包含指针类型,只需要向前声明它们。例如,randomType * f();不需要在其标题中包含randomType的标头。您所要做的就是使用class randomType;

  • 转发声明
  • 引用也可以直接声明。

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:-1)

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

#include "a.hpp"

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