Adding/Removing headers 没有效果

Adding/Removing headers has no effect

我在我的代码中使用了 std::invalid_argument 异常 class。所以我还在预编译的 header 中包含了 header <exception> (在我的例子中是 pch.h )。但是后来我从 pch.h 中删除了 <exception> 并且代码在 GCC 11.2 上成功编译,我很惊讶。

这里有一些例子:

#include <exception> // removing this does not have any effects
#include <array> // the same here
.
.
.
throw std::invalid_argument( exceptionMsg ); // somewhere in the code
.                                            // how does this work?
.
.
std::array<int, 4> buffer { }; // somewhere in the code
.                              // how does array work without #include <array> ??
.
.

同样,我从 pch.h 中删除了 <iterator><array><cstring> 等,但仍然没有问题。这怎么可能?

所以如果包含 headers 对编译代码没有帮助,那么它们的目的是什么?如果编译器不抱怨,删除这些 #include 是否安全?

But then I removed from pch.h and the code compiled successfully on GCC 11.2 and I was surprised.

这并不罕见。你会习惯的。

How is this possible?

当您仍然包括的其中一个 header 碰巧也包括那些您没有直接包括的 header 时,就会发生这种情况。

Is it safe to remove these #includes if the compiler does not complain?

没有。不直接包含您所依赖的 header 是不安全的。当一个 header 停止包含另一个 header 时,那个 header 可能最终不会被包含,如果你依赖那个 header,那么你的程序将停止编译.为避免这种情况发生,请始终直接包含您依赖的所有 header。