假设我们有四个文件:ah、a.cpp、b1.h 和 b2.h。而且,我们需要在 ah 或 a.cpp 中包含 b1.h 和 b2.h。我应该在哪里包括 b1 和 b2?假设只有 a.cpp 需要 b1 和 b2。
5 回答
如果头文件不需要它,则将其包含在 cpp 中。
这减少了编译时间并有助于理解模块之间的依赖关系。
一般规则是,您应该避免在不使用其中定义的标头中包含标头。
仅包含标题中需要的内容。
ah的类定义和函数声明需要b1.h还是b2.h?然后包括需要的内容。
否则仅包含在 .cpp 中。
请记住,每次包含文件时,您的编译时间都会更长。
以下是一些关于何时需要的提示:
不需要包含返回值或参数。例如
std::string blahFunc(std::string a);
不需要<string>
包含在头文件中(但仍然需要前向声明)不需要包含指针类型,它们只需要前向声明即可。例如
randomType * f();
不需要在其标头中包含 randomType 的标头。您所要做的就是向前声明class randomType;
引用也可以只是前向声明。
如果 b1.h 和/或 b2.h在 ah 中实际使用struct
了类似ortypedef
等定义(例如,在函数原型中作为参数或返回类型),那么您应该将它们包含在标题的顶部。
否则,如果 b1.h/b2.h 仅提供 a.cpp 内部使用的定义(私有成员等),则将其包含在 a.cpp 的顶部。
您应该尝试仅在文件中包含编译器理解该文件实际需要的内容。(与窗户不同,它的怪物是<Windows.h>
.)
I think the include directives should always be in your .h** files. The only include you should put in the a.cpp file should be
#include "a.hpp"
To understand why, suppose Bob uses your code inside his program, and your code is not disclosed (i.e., you provide it only as a library). Then all he can see are your headers. If you include everything you need in your headers, he will still be able to check what are the dependencies of your code and make sure he has everything needed by your code. If you put the include directives in the .c** files, then unless your code is open source (i.e. he has access to the .c** files) he won't be able to see what are the packages he must make sure to have installed.