[英]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.