0

gccが提供するヘッダーstddef.hを読んだところ、間違いの可能性がありました。最初は間違いだと思います。しかし、gccの3つの異なるバージョン(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__いません)または、さまざまな機能の1つがまだ必要な場合__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 に答える