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