我听说你应该更喜欢写内部包含警卫而不是外部包含警卫。我在互联网上搜索过但没有找到答案。
这是Herb& S的C ++ Coding Standards一书的摘要。安德烈显示了一个外部包括后卫":
避免使用旧版中提倡的过时的外部包含警卫 书:
#ifndef FOO_HJNCLUDED_ //NOT recommended
#include "foo.h"
#define FOO_HJNCLUDED_
#endif
现在,这导致了以下问题:
问: 什么是内部包括后卫,什么是外部包括后卫?两者之间有什么区别,为什么内部包括警卫首选?我希望答案也能提供一个例子。
编辑:我最后回答了自己的问题。
答案 0 :(得分:4)
这是我见过的,可能解释了这个评论。
在这里,foo.h
定义了一个“内部包含守卫”(大多数人简称为“包含守卫”,因为它是传统的做法)。
// foo.h
#ifndef _FOO_H__
#define _FOO_H__
// ...
#endif // _FOO_H__
相比之下,bar.h
在foo.h
之外使用foo.h
的包含守卫。我们可以将此称为“外部包含守卫”。
// bar.h
#ifndef _BAR_H__
#define _BAR_H__
#ifndef _FOO_H__
#include "foo.h"
#endif
// ...
#endif // _BAR_H__
我工作的一个(非常大的)项目声称这提高了编译速度,但声称是可疑的,因为在我看来,这似乎是一个简单的编译器优化,我没有看到任何指标来证明索赔。但是,我们注意到包含多个头文件时读取很烦人。
答案 1 :(得分:2)
经过深入挖掘,我现在可以回答我自己的问题了。
将"的常用习语包括在包含的头文件内容周围的守卫" :
<强> header.h 强>
#ifndef HEADER_H
#define HEADER_H
// Contents of include file
#endif
因此,即使标题多次#include
,标题的内容也将被处理一次。
这被称为&#34;内部包含警卫&#34; ,因为警卫完全是头文件的内部。
然而,上述方法可能存在问题如果编译器采用一种简单的方法,多次打开文件以检查&#34;内部包含警卫&#34; 可能会导致大型项目的编译时间增加。
<强> header2.h 强>
#ifndef HEADER_H
#include "header.h"
#endif
// Rest of header file goes here
#ifndef HEADER_H
行仍然定义并在header.h
内检查内部。但是通过检查它外部,编译器可能会避免必须打开文件。
当其他头文件中包含头文件时,仅建议检查外部。
当从源文件中包含时,不需要检查。