【问题标题】:C++, Should I #include something if I need it *and* something else it includes?C++,如果我需要它*和*它包含的其他东西,我应该#include 吗?
【发布时间】:2016-08-21 04:08:19
【问题描述】:

假设我有一个名为foo.h 的头文件,它包含另一个头文件bar.h

我还有一个名为xyz.h 的头文件。它需要foo.hbar.h,尽管foo.hbar.h 彼此无关,所以我会觉得很奇怪只是 包含foo.h(它仍然可以编译,因为它包括bar.h...

所以,foo.h 包括 bar.hbar.h 包括 foo.h,但 xyz.h 确实 包括 foo.h 和 @987654339 @。这是不好的做法吗?有什么理由我不应该吗?为什么我能做到这一点?

【问题讨论】:

  • 这是常见的做法。您并不总是知道标头包含哪些其他头文件,因此您包含所有您需要的头文件。 #include guards 防止出现两次包含相同标题的问题。
  • 每个头文件都应该包含 所有 it 需要的头文件,而忽略它们是否可能会通过另一个头文件偶然包含(因为这可能会改变)。
  • 通过搜索引擎查找“包括您使用的内容”。它应该会显示include-what-you-use.orggithub.com/include-what-you-use/include-what-you-use 以及其他引用。
  • @JonathanLeffler 这看起来真的很有用,谢谢你的链接!
  • "...foo.h,它包含另一个标题 bar.h。... ...虽然 foo.h 和 bar.h 彼此无关。" - 这很奇怪。 如果foo.hbar.h 彼此无关,那你为什么要在foo.h 中包含bar.h

标签: c++ c coding-style


【解决方案1】:

每个标题都应该是独立的。它应该包括它需要的所有其他标头并具有include guards

假设标题不是自包含的。然后,如果您希望在不同的客户端中使用该标头,那么除非您找到并提取需要的其他标头,否则新客户端甚至不会编译。

头文件不能自包含的情况也可能很少见,例如详情请查看Google's code style

大多数编译器都支持包含依赖项调查的选项。这些选项和其他工具在此question 中进行了讨论。

【讨论】:

  • 你在第一段中说的是真的——它通常被称为“自包含和幂等”。但是,当您涉及多个标头时,这个问题是在问“自包含意味着什么”。问题是标题 A.h 可以是自包含的,因为它包含另一个标题 B.h,而 B.h 又包含 C.h,而 C.h 定义了 A.h 使用的东西。虽然 B.h 继续需要 C.h,但 A.h 是自包含的,因为它可以工作,但如果 B.h 发生变化,不再需要 C.h 但 A.h 仍然需要 C.h,那么 A.h 不再是自包含的——因为 B.h 发生了变化.
  • @JonathanLeffler 如果A.h 使用了在C.h 中定义的东西,那么它应该包括C.h 或者对使用过的东西有一个前向声明。我将其理解为“自包含”标题。
  • 我明白了;我同意。但是你如何证明 A.h 不是正确自包含的,而 B.h 仍然包含 C.h?请参阅Should I use #include in headers? 了解 C 程序员对事物的看法,以及一些确保自包含的相当有效的方法。但是“相当有效的方法”很容易受到上述 A.h、B.h、C.h 场景的影响——而且没有一种简单的方法可以避免这种情况。见Include-What-You-Use.org等。
  • @JonathanLeffler 是的,在没有自动工具的情况下理解依赖关系通常有点棘手。
猜你喜欢
  • 1970-01-01
  • 2013-12-31
  • 2012-05-25
  • 1970-01-01
  • 1970-01-01
  • 2017-05-22
  • 1970-01-01
  • 1970-01-01
  • 2012-05-01
相关资源
最近更新 更多