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 | 会社 | 鯖缶 | 全学ゼミ |

Apple Store(Japan)

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 とあるのに…)。

本日のツッコミ(全2件) [ツッコミを入れる]
_ kuma (2007-12-20 (Thu) 14:19)

JTC1/SC22/WG14のページからダウンロードできるものは、厳密に言えば「規格書」ではなくて、「規格書と同一内容のWG14部内レビュー用文書」です。いや、我々からするとどっちでもいいんですが。

_ koma2 (2008-01-07 (Mon) 00:36)

kumaさん、コメントありがとうございます。今ごろ気付きました(苦笑)。

厳密な意味での「規格書」が欲しければ、ちゃんと買えってことなんですかね。
まぁ、内容に相違がなければどっちでもいいんですけど。;)

本日のリンク元
その他のリンク元
検索