正如您所说的那样,“冗余包含守卫”可以加快编译速度。
如果没有冗余保护,编译器将迭代整个 foo.h 文件,寻找一些可能在#ifndef
块之外的代码。如果它是一个长文件,并且在很多地方都这样做了,编译器可能会浪费很多时间。但是使用冗余保护,它可以跳过整个#include
语句,甚至不重新打开该文件。
当然,您必须进行试验并查看编译器迭代 foo.h 而实际上没有编译任何东西所浪费的实际时间;也许现代编译器实际上会寻找这种模式并自动知道根本不用打开文件,我不知道。
(由 280Z28 开始编辑)
以下标头结构至少被GCC 和 MSVC 识别。使用这种模式实际上否定了您在包含文件中使用警卫可以获得的所有好处。请注意,编译器检查结构时会忽略注释。
// GCC will recognize this structure and not reopen the file
#ifndef SOMEHEADER_H_INCLUDED
#define SOMEHEADER_H_INCLUDED
// Visual C++ uses #pragma once to mark headers that shouldn't be reopened
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
# pragma once
#endif
// header text goes here.
#endif
(结束编辑)