最近我在工作中讨论了一个问题,我质疑使用双重包含保护是否比单重更好。我所说的双重包含保护如下:
头文件 "header_a.hpp":
#ifndef __HEADER_A_HPP__
#define __HEADER_A_HPP__
...
...
#endif
当在头文件或源文件中包含头文件时:
#ifndef __HEADER_A_HPP__
#include "header_a.hpp"
#endif
现在我明白了,在头文件中使用守卫的作用是防止重复包含已经定义过的头文件,这是很常见并且有良好的文档说明。如果宏已经被定义,整个头文件将被编译器视为“空白”,以防止重复包含。很简单。
问题是我不理解在 #include "header_a.hpp"
周围使用#ifndef __HEADER_A_HPP__
和#endif
。我的同事告诉我,这样做可以添加第二层保护来防止重复包含,但我无法理解如果第一层绝对能够完成工作,那么第二层的作用是什么(或者有吗?)。
唯一想到的好处就是彻底停止链接器打扰文件。这是否意味着这可以提高编译时间(这并没有被提及为一个好处),或者有其他我看不到的东西起作用?
__HEADER_A_HPP__
)的名称以及以下划线和大写字母开头的名称都被保留供实现使用。请勿在您的代码中使用它们。 - Pete Becker