繁体   English   中英

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

[英]When to include foo.h in foo.cpp

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

我何时应该在源文件(foo.cpp)中#include头(foo.h)?

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

// 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而没有包含指令。

每个头文件都可以自行编译,可以避免神秘的失败,否则,当您更改与foo.cpp无关的文件中的include伪指令时,就会发生这种错误。 这些有时很难识别,并且总是令人沮丧。

如果在标题内使用任何内容,则需要包括标题。

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

您只需要包含您将要使用的东西。

您可以随时包含头文件。
无论如何,假设您有一个类似于以下文件的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的定义时不可见。
因此,经验法则可能是- 在开始使用该文件导入的内容(让我说)之前立即添加标头

无论如何,这会很快导致混乱的文件,并且#include指令四处散布,一种常见的做法是将所有文件都放在文件的顶部,仅此而已。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM