我最近开始做一个项目,在那里我遇到了这个:
#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
),这应该不是问题,因为代码本身仍然受到多重包含的保护。
但是,它几乎肯定会影响编译时间(多少取决于项目大小),原因有两个:
- 现代编译器通常会检测"经典"包含保护,并忽略该文件的任何进一步
#includes
(就像#pragma once
一样)。您显示的结构会阻止该优化。
每个 - 编译单元都会变得更大,因为每个文件将被更频繁地包含 - 就在预处理器再次删除所有非活动块之前。
无论如何,我想不出这样的结构会有什么好处。也许这是一些奇怪的历史原因的结果,比如在试标准C++时间在你的代码库上使用的一些晦涩的分析工具。