内部与外部包含防护

And*_* DM 6 c++ include-guards header-files

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

这是 Herb & Andrei 所著的 C++ Coding Standards 一书的片段,其中显示了“外部包含保护”:

避免使用旧书中提倡的过时的外部包含保护:

#ifndef FOO_HJNCLUDED_ //NOT recommended
#include "foo.h"
#define FOO_HJNCLUDED_
#endif
Run Code Online (Sandbox Code Playgroud)

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

问: 什么是内部包含保护,什么是外部包含保护?两者之间有什么区别,为什么首选内部包含守卫?
我希望答案也提供了一个例子。

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

And*_*ron 6

这是我看到的可能解释了评论的内容。

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

// foo.h
#ifndef _FOO_H__
#define _FOO_H__

// ...

#endif  // _FOO_H__
Run Code Online (Sandbox Code Playgroud)

与此相反,bar.h使用foo.h的包括防护罩外foo.h。我们可以将其昵称为“外部包含保护”。

// bar.h
#ifndef _BAR_H__
#define _BAR_H__

#ifndef _FOO_H__
#include "foo.h"
#endif

// ...

#endif  // _BAR_H__
Run Code Online (Sandbox Code Playgroud)

我参与的一个(非常大的)项目声称这提高了编译速度,但这种说法是可疑的,因为在我看来这就像一个微不足道的编译器优化,而且我还没有看到任何指标来证明这一说法。但是,我们确实注意到在包含多个头文件时阅读起来很烦人。

  • @AndreasDM如果它是内部的,那么您不必记住将包含保护放在包含受保护文件的每个文件中。假设您有一个非常有用的头文件,您将其包含在项目的五个不同位置。当您想考虑其他问题时,您是想写一次包含守卫,还是记得写五次? (5认同)