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

时间:2016-10-25 19:29:27

标签: c++ c-preprocessor header-files

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

我应该在源文件(foo.cpp)中#include何时return IntegrationFlows.from("FileContentChannel") .handle(Http.outboundGateway("http://host:port/paymentinfo/") .charset("UTF-8") .httpMethod(HttpMethod.GET) .headerMapper(headers) .expectedResponseType(String.class)) .channel(MessageChannels.queue("APIResponseChannel")) .get(); 标题(foo.h)?

3 个答案:

答案 0 :(得分:3)

将其置于顶部的原因只是检查其内容是否依赖于任何其他标头。例如:

// 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伪指令时发生的神秘失败。这些有时难以识别,而且总是令人沮丧。

答案 1 :(得分:1)

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

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

您只需要包含您知道将要使用的内容。

答案 2 :(得分:1)

您可以随时添加标题文件。
无论如何,假设您有一个类似于以下文件的文件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指令四处传播,通常的做法就是将所有这些指针放在文件的顶部,这就是全部。