【问题标题】:Do I need to include libraries in my main cpp, even if it's been included in a header file?我是否需要在我的主 cpp 中包含库,即使它已包含在头文件中?
【发布时间】:2021-08-05 15:05:15
【问题描述】:

假设我有一个文件 player.h,在 player.h 中我包含以下内容:

#include <iostream>
#include <string>
#include <vector>
#include <fstream>

我是否需要在player.cpp 中再次包含这些内容,在那里我充实了头文件中声明的函数?如果我不这样做,我是否需要在运行 main.cpp 时包含它们,它从我的各种 .cpp 和 .h 中调用函数

学校从来没有真正告诉过我是否要这样做,所以我总是把所有东西都包括在内。如果没有必要,多次包含所有内容与不这样做有什么明显区别吗?

【问题讨论】:

  • 不,如果player.cpp #includes player.h,则不需要将它们包含在player.cpp 中 - 但通常建议在每个文件中包含您使用的内容。
  • 不完全确定你的意思,但如果你在 player.cpp 文件中 #include "player.h",那么那些 #include 行将自动添加到 player.cpp。你问的是这个吗?
  • @Ted 但是不包含大量系统头文件重复有点违背了已经包含它们的单个预编译头文件的目的?
  • @AdrianMole 是的,我想这也是真的。

标签: c++ include header-files


【解决方案1】:

包含预处理器指令告诉预处理器用文件的内容替换它。因此,当你有

// some_header.h
#include <foo>

和

// some_source.cpp
#include <some_header.h>

那么如果你编译source.cpp,编译器在预处理步骤之后看到的是这样的:

// some_source.cpp
... contents of foo ...

即:#include &lt;some_header.h&gt; 被该标题的内容替换,#include &lt;foo&gt; 被foo 的内容替换。

不,您不需要包含两次标题。虽然标题应该包含警卫,但它也不会受到伤害。建议是:包括您使用的内容(但不要更多)。

【讨论】:

  • 非常感谢,我很欣赏答案的清晰性。我认为不需要包含两次,但我认为检查是值得的。有趣的是,包含不止一次并不会损害项目。我的想法是,例如,如果它加载同一个库 100 次,它可能会减慢项目的速度。
  • @Skullruss 在这里你可以找到更多关于预处理器和包括守卫的信息:stackoverflow.com/a/8020211/4117728
猜你喜欢
  • 2011-05-14
  • 2013-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-26
  • 1970-01-01
  • 2012-04-04
  • 1970-01-01
相关资源
最近更新 更多