0

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

“不”字要不要删掉?

这很容易,但如果是错误,为什么没有发现并改变错误?

4

1 回答 1

1

我认为这不是一个真正的错误,甚至几乎不是一个化妆品疣。

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

  2. 评论是说“这些不同的定义之前都没有定义过”。

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

当然,评论中的语言可以更精确,但缩写是相当典型的完成方式。很清楚指#if#endif是哪个。您可以提交建议的补丁,但如果没有发生任何事情,请不要感到惊讶。如果它是我的标题并且我需要这么复杂,我可能会使用类似的东西:

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

我可能很想使用:

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

毫无疑问,这些评论和定义中有很多历史。系统标头不是学习的好地方。它们往往是高深莫测的,因为它们同时受到一组不同标准的驱动,并且随着标准的发展,它们会随着时间的推移而增加复杂性。

于 2012-08-31T05:34:50.863 回答