包括外部包括警卫的语句



我最近开始做一个项目,在那里我遇到了这个:

#include <string.h> // includes before include guards
#include "whatever.h"
#ifndef CLASSNAME_H // header guards
#define CLASSNAME_H
// The code
#endif

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

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

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

包含保护应围绕标头的全部内容;我想不出例外(当标头保护首先是合适的时 - C 标头<assert.h>是出于充分理由没有标头

保护的标头保护)。

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新