标头stddef.h中可能存在错误

时间:2012-08-31 03:16:14

标签: gcc defined

当我读到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 */

是否应删除“不”字样?

这很容易,但如果错了,为什么没有找到并改变错误?

1 个答案:

答案 0 :(得分:1)

我认为这不是一个错误,甚至几乎都不是化妆品。

  1. 它在注释中,对编译器看到的内容没有影响(预处理器删除了注释)。

  2. 评论说''之前没有定义过这些不同的定义。'

    即:(_STDDEF_H未定义,_STDDEF_H_未定义,_ANSI_STDDEF_H未定义且__STDDEF_H__未定义) OR 如果我们仍然需要各种__need_XXX功能之一,则会处理标题的正文。在添加||条款之前,它更清楚;它们可能比标识头文件的主要定义符号集更晚添加。

  3. 当然,评论中的语言可以更精确,但缩写是相当典型的完成方式。很明显#if #endif指的是#endif /* (!_STDDEF_H && !_STDDEF_H_ && !_ANSI_STDDEF_H && !__STDDEF_H__) || __need_XXX */ 。您可以提交建议的补丁,但如果没有发生任何事情,也不要感到惊讶。如果它是我的标题,我需要那么多的复杂性,我可能会使用类似的东西:

    #endif /* (!_STDDEF_H && !_STDDEF_H_ && ...) || __need_XXX || ... */
    

    我可能会想要使用:

    {{1}}

    毫无疑问,这些评论中有很多历史和定义。系统标题不是一个值得学习的好地方。它们往往是不可理解的,因为它们是通过各种标准同时在多个方向上驱动的,随着标准的发展,它们会随着时间的推移而产生并发症。