假设我们有四个文件:a.h,a.cpp,b1.h和b2.h.并且,我们需要在a.h或a.cpp中包含b1.h和b2.h。我应该在哪里包括b1和b2?假设只有a.cpp需要b1和b2。
答案 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的定义如struct
或typedef
等实际上使用啊(在函数原型中作为参数)或者返回类型,例如),那么你应该将它们包含在标题的顶部。
否则,如果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 **文件),否则他将无法看到他必须确保的包是什么已安装。