何时在 foo.cpp 中包含 foo.h

When to include foo.h in foo.cpp

我经常在 "foo.cpp" 的顶部看到人 #include "foo.h"。看起来你 可以 总是这样做,但人们不会。所以选择背后一定有一些原因。

我什么时候应该 #include 源文件 (foo.cpp) 中的 header (foo.h)?

如果您在 header 中使用任何内容,则需要包含 header。

例如,如果您需要在 main 方法中创建 foo someObject = new foo();,则需要包含具有该 class 定义的 header foo.h

您只需添加您知道将要使用的内容。

将它放在顶部的原因只是为了检查其内容不依赖于任何其他 header。例如:

// foo.h
void f(std::vector<int>& v);

// foo.cpp
#include <vector>
#include "foo.h"

// foo1.cpp
#include "foo.h"
#include <vector>

在 foo.cpp 中,没有问题:一切都可以正常编译。另一方面,foo1.cpp 不会编译,因为 foo.h 使用 std::vector 而没有 include 指令。

让每个 header 文件都可以自行编译,避免了当您更改与 foo.cpp 无关的文件中的 include 指令时发生的神秘故障。这些有时很难识别,而且总是令人沮丧。

您可以随时添加 header 文件。
无论如何,假设您有一个类似于以下文件的文件 main.h

#ifndef FOO_H
#define FOO_H
struct S { };
#endif

现在,这个 main.cpp 工作得很好,正如你提到的:

void f() { }
#include "foo.h"
int main() { f(); }

无论如何,如果我稍微改变 main.cpp 它就不再起作用了:

void f() { S s{}; }
#include "foo.h"
int main() { f(); }

问题是S是在第一次使用后声明的,第一次遇到f的定义时不可见
因此,经验法则可能是 - 在您开始使用由该文件导入的内容(让我说)之前立即包含一个 header.

无论如何,这可能会很快导致带有 #include 指令的混乱文件散布在各处,通常的做法是将所有指令简单地放在文件顶部,仅此而已。