C言語のbool型とその名前について 〜もう_Boolは嫌だ〜
先史時代
昔のC言語には標準的なbool型はありませんでした。比較演算子は int
を返しますし、 isspace
みたいな述語関数も int
を返します。
環境(プラットフォーム・ライブラリ)によっては独自のbool型を定義していることがありました。Windowsでの BOOL
型[1]とか、Objective-Cの BOOL
[2]とか。
このようなオレオレbool型の欠点は、0/1以外の値を取れることです。また、下手にインクリメントとかするとオーバーフローします。
C99でのbool
C99では標準的なbool型が導入されました。しかし、互換性に配慮して bool
ではなく _Bool
という奇妙な名前で導入され、 bool
という名前や true
, false
などの名前つき定数を使うには <stdbool.h>
を #include
する必要があります。
// stdbool.h
#define __bool_true_false_are_defined 1
#define bool _Bool
#define true 1
#define false 0
ちなみに、 bool
, true
, false
の各マクロはプログラム中で #undef
や再 #define
可能です。
C23ではどうなるか
bool
, true
, false
を使うためにわざわざ #include <stdbool.h>
するのは面倒です。幸い、C99から20年以上経過しており、アンダースコアなしの名前をキーワードにしても互換性の問題は少なくなっているでしょう。
ということで、C23では何も #include
しなくてもアンダースコアなしの bool
, true
, false
が使えるようになる見込みです。
処理系はアンダースコアなしの名前を定義済みマクロとして提供しても良いし、組み込みのキーワードとして提供しても良いことになっています。bool
というトークンを文字列化マクロに通した結果はC標準では規定しないということです。
C17準拠の処理系が最小限の変更でC23に対応するなら、次のような定義済みマクロを追加することになるでしょう:
#define bool _Bool
#define false ((bool)+0)
#define true ((bool)+1)
N2934では _Bool
の他に _Alignas
, _Alignof
, _Static_assert
, _Thread_local
がこのような取り扱いをされることになっています。
参考文献
- N2934 Jens Gustedt, Revise spelling of keywords v7
- N2935 Jens Gustedt, Make false and true first-class language features v8
Discussion