为什么放置 #include 之前包括警卫
Why Placing #include BEFORE include guards
是否有任何正当理由在头文件中的包含保护之前放置 #include 指令,如下所示:
#include "jsarray.h"
#include "jsanalyze.h"
#include "jscompartment.h"
#include "jsgcmark.h"
#include "jsinfer.h"
#include "jsprf.h"
#include "vm/GlobalObject.h"
#include "vm/Stack-inl.h"
#ifndef jsinferinlines_h___
#define jsinferinlines_h___
//main body mostly inline functions
#endif
请注意,这个例子取自一个现实生活中备受瞩目的开源项目,应该由经验丰富的程序员开发 - Firefox 10 中使用的 Mozilla Spidermonkey 开源 Javascript 引擎(最新版本中也存在相同的头文件)。
在备受瞩目的项目中,我希望它们的设计背后一定有一些正当的理由。在包含警卫之前进行#include
的正当理由是什么?它是否适用于仅内联函数头文件的模式?另请注意,这个头文件 (jsinferinlines.h) 实际上是通过最后一个 #include "vm/Stack-inl.h"
包含自身(这个头文件包括许多其他头文件,其中一个实际上再次包含这个 jsinferinlines.h)指令之前包含 include guard,这对我来说更没有意义。
因为您希望这些标头包含自己的守卫,因此实际上没有任何区别。
另请注意,这个头文件 (jsinferinlines.h)实际上是通过最后一个 #include"vm/Stack-inl.h"(这个头文件包含许多其他头文件,其中一个实际上再次包含这个 jsinferinlines.h)指令包含自身,这对我来说更没有意义。
它不会有任何不同,因为包含该文件时,工作流将是:
- 包括所有标头,最多
"vm/Stack-inl.h"
- 包括
"vm/Stack-inl.h"
直到最后#include "jsinferinlines.h"
(您的文件) - 再次包含文件
jsinferinlines.h
(跳过所有以前的包含,因为包含保护) - 到达过去
#include "vm/Stack-inl.h"
- 最后从
#ifndef jsinferinlines_h___
开始处理
但总的来说,相互标头递归是不好的,应该不惜一切代价避免。
当时 SpiderMonkey 标头中有很多包含循环,将标头保护放在顶部会导致难以理解的编译错误 - 我怀疑将标头保护放在包含下方只是清理包含的增量步骤。
不过,我无法告诉你导致它发挥作用的确切包含顺序。
如今,SM 标头中不应该有任何包含循环,它们的样式是通过 Nicholas Nethercote 编写的 python 脚本强制执行的。如果你今天看一下jsinferinlines.h,你会看到标题护罩位于它所属的顶部。
- 既然存在危险,为什么项目要使用-I include开关
- 有充分的理由在h文件中使用include保护而不是cpp文件吗
- 如何将更多文件夹添加到c++include路径
- 什么是"#include <boost/functional/hash.hpp> "?
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- Windows 10-使用gtkmm-3.0库和g++[包括再现]的分段故障
- 为什么 cmake 许可证<>样式不包括?
- 计算平均值,不包括上次得分
- 从多个源构造一个对象,包括一个对象向量
- 对于MacOS上的G++,如何添加默认的include目录/usr/local/include和默认的库搜索路径/usr
- 如何指定远程预处理器包括192.0.2.17://usr/include的路径
- C1189: #error : 窗户。H 已包括在内。MFC 应用不得 #include < Windows.h>
- 当我<exception>似乎可以使用 std::exception 时,即使它不包括在内,是否有必要 #include?
- 包括新文件夹中的头文件 "cannot open include file - no such file or directory"
- Visual Studio 2010 C++不包括 #include 中的文件
- 包括/usr/local/include中的标头和/usr/local/lib中的库
- 错误 C1189:#error:窗口。H 已包括在内。MFC 应用不得 #include < Windows.h>"**
- 包括没有# Include的文件
- 为什么放置 #include 之前包括警卫
- 致命错误 C1189:#error:窗口。H 已包括在内。MFC 应用不得 #include < Windows.h>