daily memorandum 2.3.0
CBUG | FreeBSD | Hiki | Knoppix | Mac | Ruby | W-ZERO3 | Windows | ad | amd64 | ks | linux | momonga | net | print | security | tdiary | unix | www | 会社 | 鯖缶 | 全学ゼミ | 本
2007-12-01 (Sat)
_ C で bool型
ISO C++ とか C99 とかの規格が固まって処理系の実装が進んでいる頃(GCC 3.2 の頃)に 開発から足を洗ってしまったせいで、すっかりその辺の事情に疎くなってるらしい… 最近の C って bool型(より正確には _Bool型)とか true/false 使えるのね。
_Bool型と bool/true/false
組み込みの _Bool型が定義され、 stdbool.h では bool/true/false というマクロが(C++との互換性のため?)定義されてます。
ISO/IEC 9899:TC2 によると、
- マクロ bool は _Bool に展開されるべし。
- マクロ true は整数定数値 1 に展開されるべし。
- マクロ false は整数定数値 0 に展開されるべし。
だそうで、実際 FreeBSD 6.2 の /usr/include/stdbool.h では
#define false 0 #define true 1 #define bool _Bool
なんて定義されてます。
最初にこの実装の方を見てしまったので、 「これって implemetation dependent だったりしないよね?」と ちょっと心配になったのだけど、 規格にちゃんと書いてあるので「true が 1 で false が 0」というのは 安心して使って良さそう。
_Bool 型の変数に 0, 1 以外を代入すると?
When anyscalar value is converted to _Bool, the result is 0 if the value compares equal to 0; otherwise, the result is 1.
とあるので、bool (_Bool) 型の変数に 0, 1 以外の値を代入しても 強制的に 0 or 1 にされてしまいます。
#include <stdio.h>
int main() {
_Bool a = 1;
_Bool b = 2;
printf("a=%d, b=%d\n", a, b);
return 0;
}
% gcc bool.c
% ./a.out
a=1, b=1
つーことで、enum 使って bool の emurate するよりマトモに使えそう。
#include <stdio.h>
typedef enum {true = 1, false = 0} bool;
int main() {
bool hoge = 2;
printf("%d\n", hoge);
return 0;
}
% gcc enum.c
% ./a.out
2
参考
_ ISO C99 の規格
ISO JTC1/SC22/WG14 のページからダウンロード出来る なんて、実は今日の今日まで知らなかったりして…orz
ISO C++ は相変わらず ANSI から買う 以外ないみたいだけど。しかも、今 ANSI のサイト見たら、$30 に値上げされてるし… (C++ FAQには $18 とあるのに…)。
JTC1/SC22/WG14のページからダウンロードできるものは、厳密に言えば「規格書」ではなくて、「規格書と同一内容のWG14部内レビュー用文書」です。いや、我々からするとどっちでもいいんですが。
kumaさん、コメントありがとうございます。今ごろ気付きました(苦笑)。<br><br>厳密な意味での「規格書」が欲しければ、ちゃんと買えってことなんですかね。<br>まぁ、内容に相違がなければどっちでもいいんですけど。;)