web-dev-qa-db-ja.com

clangのstdbool.hに#define false falseが含まれているのはなぜですか

コンパイラエラーによって指摘された後、clangの stdbool.h ファイルに(特に)次の行が含まれていることに気付きました。

#define bool  bool
#define false false
#define true  true

これらは#ifdefブロックに含まれていて、間接的に__cplusplusを適用するため、stdbool.hがCヘッダーであってもc ++タグは含まれます。

これらの定義の必要性は何ですか?プリプロセッサに関連するいくつかの理由でそれらが必要になると思いますが、標準のどの部分またはどの技術的理由で標準になっているのかを知りたいので、clangにそれらを含める必要があります。

stdbool.hはCヘッダーであり、C++ヘッダーではありません。 truefalseはC++ではすでにキーワードであるため、通常はC++プログラムにはありません。

したがって、C++プログラムにstdbool.hが含まれている場合、移植されたCプログラム(C++としてコンパイルされているCプログラムなど)であることはかなり明確です。この場合、G ++はC++モードでstdbool.hをGNU拡張として GCC stdbool.h からのコメントに従ってサポートします。

/* Supporting <stdbool.h> in C++ is a GCC extension.  */
#define _Bool        bool
#define bool        bool
#define false        false
#define true        true

...

/* Signal that all the definitions are present.  */
#define __bool_true_false_are_defined        1

同様に、ClangはG ++との互換性のためにC++でstdbool.hをサポートしています。値は、従来のC99定義ではなく、組み込みのC++型と一致するように意図的にここで定義されています。それらは、おそらく C99標準 との互換性を提供するためにマクロとして定義され、これには以下が必要です。

ヘッダーは次のmacrosを定義します:booltruefalse__bool_true_false_are_defined

アプリケーションは、マクロbool、true、falseの定義を解除してから再定義する場合があります。

50
nneonneo

このパッチ [[cfe-commits] r115028 からわかるように、サポートに追加されました C++のGNUモード

GNU互換のC++方言を使用している場合は、_Bool、bool、true、falseのマクロを定義します。修正<rdar:// problem/8477819>。

したがって、gccはこれを拡張機能としてサポートし、この変更はその拡張機能をサポートするために行われました。

パッチに記載されている元の問題レポートは見つかりませんが。

ドラフトC++ 11標準セクション18.10の他のランタイムサポート[support.runtime]からわかるように、これは非準拠です。

ヘッダー<cstdbool>およびヘッダー<stdbool.h>は、bool、true、またはfalseという名前のマクロを定義しません。

ただし、gccはGNUモードで厳密に準拠することを意味していません。

stdbool.hはC99の一部であるため、Annex DでC++ 11まで、C++標準ではサポートされていませんでした。

表154に示すように、C標準ライブラリおよびC Unicode TRとの互換性のために、C++標準ライブラリは25個のCヘッダーを提供します。

<stdbool.h>が含まれています。

18
Shafik Yaghmour