当我读到gcc提供的标题stddef.h时,我发现了一个可能的错误。起初,我确定这是一个错误。但是在我阅读了三个不同版本的gcc(3.4.5,4,4,3和4,6,3)的标题stddef.h之后,我发现它们在这一点上是相同的,所以我不确定。也许我错了。
#if (!defined(_STDDEF_H) && !defined(_STDDEF_H_) && !defined(_ANSI_STDDEF_H) \
&& !defined(__STDDEF_H__)) \
|| defined(__need_wchar_t) || defined(__need_size_t) \
|| defined(__need_ptrdiff_t) || defined(__need_NULL) \
|| defined(__need_wint_t)
上面的代码是stddef.h的开头。以下是stddef.h的结尾。有一对。
#endif /* !_STDDEF_H && !_STDDEF_H_ && !_ANSI_STDDEF_H && !__STDDEF_H__
|| __need_XXX was not defined before */
我认为该行存在错误:
|| __need_XXX was not defined before */
是否应删除“不”字样?
这很容易,但如果错了,为什么没有找到并改变错误?
答案 0 :(得分:1)
我认为这不是一个错误,甚至几乎都不是化妆品。
它在注释中,对编译器看到的内容没有影响(预处理器删除了注释)。
评论说''之前没有定义过这些不同的定义。'
即:(_STDDEF_H
未定义,_STDDEF_H_
未定义,_ANSI_STDDEF_H
未定义且__STDDEF_H__
未定义) OR 如果我们仍然需要各种__need_XXX
功能之一,则会处理标题的正文。在添加||
条款之前,它更清楚;它们可能比标识头文件的主要定义符号集更晚添加。
当然,评论中的语言可以更精确,但缩写是相当典型的完成方式。很明显#if
#endif
指的是#endif /* (!_STDDEF_H && !_STDDEF_H_ && !_ANSI_STDDEF_H && !__STDDEF_H__) || __need_XXX */
。您可以提交建议的补丁,但如果没有发生任何事情,也不要感到惊讶。如果它是我的标题,我需要那么多的复杂性,我可能会使用类似的东西:
#endif /* (!_STDDEF_H && !_STDDEF_H_ && ...) || __need_XXX || ... */
我可能会想要使用:
{{1}}
毫无疑问,这些评论中有很多历史和定义。系统标题不是一个值得学习的好地方。它们往往是不可理解的,因为它们是通过各种标准同时在多个方向上驱动的,随着标准的发展,它们会随着时间的推移而产生并发症。