【发布时间】: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 中。
假设我们有四个文件:a.h、a.cpp、b1.h 和 b2.h。而且,我们需要在 a.h 或 a.cpp 中包含 b1.h 和 b2.h。我应该在哪里包括 b1 和 b2?假设只有 a.cpp 需要 b1 和 b2。
【问题讨论】:
如果头文件不需要,则将其包含在 cpp 中。
这减少了编译时间并有助于理解模块之间的依赖关系。
【讨论】:
一般规则是,您应该避免在不使用其中定义的标头中包含标头。
【讨论】:
如果 b1.h 和/或 b2.h 具有 struct 或 typedef 等定义,这些定义实际上在 a.h 中使用(在函数原型中作为参数或返回类型,例如),那么您应该将它们包含在标题的顶部。
否则,如果 b1.h/b2.h 仅提供在 a.cpp 内部使用的定义(私有成员等),则将其包含在 a.cpp 的顶部。
您应该尝试仅在文件中包含编译器理解该文件所需的内容。 (与 windows 不同,具有 <Windows.h> 的怪物。)
【讨论】:
只在标题中包含需要的内容。
a.h的类定义和函数声明需要b1.h还是b2.h? 然后包括需要的内容。
否则只包含在 .cpp 中。
请记住,每次包含文件时,编译所需的时间都会更长。
以下是一些关于何时需要的提示:
不需要包含返回值或参数。
例如std::string blahFunc(std::string a); 不需要在头文件中包含<string>(但仍然需要前向声明)
不需要包含指针类型,它们只需要前向声明即可。例如randomType * f(); 不需要在其标头中包含随机类型的标头。您所要做的就是通过class randomType;进行转发声明
也可以只前向声明引用。
【讨论】:
我认为包含指令应该始终在您的 .h** 文件中。您应该放入 a.cpp 文件中的唯一包含应该是
#include "a.hpp"
为了理解原因,假设 Bob 在他的程序中使用了您的代码,并且您的代码没有被公开(即,您仅将其作为库提供)。那么他只能看到你的标题。如果您在标头中包含您需要的所有内容,他仍然能够检查您的代码的依赖关系并确保他拥有您的代码所需的所有内容。如果您将包含指令放在 .c** 文件中,那么除非您的代码是开源的(即他可以访问 .c** 文件),否则他将无法看到他必须确保的包是什么已安装。
【讨论】: