include 语句外包含守卫

Include statements outside include guards

我最近开始做一个项目时遇到了这个问题:

#include <string.h> // includes before include guards
#include "whatever.h"

#ifndef CLASSNAME_H // header guards
#define CLASSNAME_H
// The code
#endif

我的问题:考虑到所有(包括的)头文件都是以相同的风格编写的:这会导致问题(循环引用等)。并且:这样做有什么(充分的)理由吗?

可能,#include 在包含保护之外可能会导致循环引用等。如果其他文件得到适当保护,则没有问题。如果其他文件都这样写,可能会有问题。

不,据我所知,没有充分的理由在 include 守卫之外使用 #include 行编写代码。

包含保护应该围绕 header 的全部内容;我想不出一个例外(当 header 守卫首先是合适的时——C header <assert.h> 是一个没有 header 守卫的人一个很好的理由)。

只要你没有循环包含(whatever1.h includes whatever2.h which includes whatever1.h)这应该不是问题,因为代码本身仍然受到保护多重包含。

然而,它几乎肯定会影响编译时间(多少取决于项目大小),原因有二:

  1. 现代编译器通常会检测到 "classical" 包含警卫并忽略该文件的任何其他 #includes(就像 #pragma once)。您显示的结构阻止了优化。
  2. 每个编译单元变得更大,因为每个文件将被更频繁地包含 - 就在预处理器再次删除所有非活动块之前。

无论如何,我想不出这样的结构会有什么好处。也许这是一些奇怪的历史原因的结果,比如在准标准 C++ 时代你的代码库上使用了一些晦涩的分析工具。