コンパイラエラーによって指摘された後、clangの stdbool.h
ファイルに(特に)次の行が含まれていることに気付きました。
#define bool bool
#define false false
#define true true
これらは#ifdef
ブロックに含まれていて、間接的に__cplusplus
を適用するため、stdbool.h
がCヘッダーであってもc ++タグは含まれます。
これらの定義の必要性は何ですか?プリプロセッサに関連するいくつかの理由でそれらが必要になると思いますが、標準のどの部分またはどの技術的理由で標準になっているのかを知りたいので、clangにそれらを含める必要があります。
stdbool.h
はCヘッダーであり、C++ヘッダーではありません。 true
とfalse
は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を定義します:
bool
、true
、false
、__bool_true_false_are_defined
。アプリケーションは、マクロbool、true、falseの定義を解除してから再定義する場合があります。
このパッチ [[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>
が含まれています。