在头文件中,将#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
请注意,这个例子是从一个真实的高知名度的开源项目中提取出来的,该项目应该由经验丰富的程序员开发 - Mozilla Spidermonkey 开源 Javascript 引擎,在 Firefox 10 中使用(同样的头文件也存在于最新版本中)。
在高知名度的项目中,我期望其设计背后必须有一些有效的原因。有哪些有效的理由可以解释为什么要在包含守卫之前使用
#include
?这种模式适用于仅内联函数的头文件吗?还要注意,这个头文件 (jsinferinlines.h) 实际上是通过最后的 #include "vm/Stack-inl.h"
(此头文件包括很多其他头文件之一,其中一个头文件再次包含了 jsinferinlines.h)指令自身包含的,在包含守卫之前,这对我来说甚至更没有意义。
fopen
的调用。合法使用包含的情况下,应该像未进行优化一样工作(否则就是一个错误),并且应该检测到错误(无限循环等),否则就是一个错误。当然,现代版本的gcc和clang应该能够处理这些边缘情况。 - Matthieu M.