内部与外部包括警卫

时间:2015-06-11 18:59:55

标签: c++ header-files include-guards

我听说你应该更喜欢写内部包含警卫而不是外部包含警卫。我在互联网上搜索过但没有找到答案。

这是Herb& S的C ++ Coding Standards一书的摘要。安德烈显示了一个外部包括后卫":

  

避免使用旧版中提倡的过时的外部包含警卫   书:

#ifndef FOO_HJNCLUDED_ //NOT recommended
#include "foo.h"
#define FOO_HJNCLUDED_
#endif

现在,这导致了以下问题:

问: 什么是内部包括后卫,什么是外部包括后卫?两者之间有什么区别,为什么内部包括警卫首选?我希望答案也能提供一个例子。

编辑:我最后回答了自己的问题。

2 个答案:

答案 0 :(得分:4)

这是我见过的,可能解释了这个评论。

在这里,foo.h定义了一个“内部包含守卫”(大多数人简称为“包含守卫”,因为它是传统的做法)。

// foo.h
#ifndef _FOO_H__
#define _FOO_H__

// ...

#endif  // _FOO_H__

相比之下,bar.hfoo.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内检查内部。但是通过检查它外部,编译器可能会避免必须打开文件。
当其他头文件中包含头文件时,仅建议检查外部
当从源文件中包含时,不需要检查。

结论:

  • 内部警卫保证正确性
  • 外部防护可能会提高某些编译器的编译速度
    • 所涉及的成本是将检查的位置放在另一个头文件中#included的头文件中,并正确拼写保护符号的名称。因此不是首选。