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。
我在我的代码中使用了 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。