Endowsの日記: Endows の へっぽこプログラマ日誌 第18回 3
日記 by
Endows
フィールドは int としてのみ宣言してもよいが、移植可能にするには、 signed あるいは unsigned を明示的に指定すべきである。(「プログラミング言語 C 第2版」183ページ)
ってことは、
struct {
unsigned char flag1 : 1;
unsigned char flag2 : 1;
} flags;
ってのは ANSI C 的にはダメなんですか? 各コンパイラの独自拡張という扱いなんでしょうか。それとも私が勘違いしてるだけなんでしょうか。
教えて偉い人。
えらくなく。 (スコア:0)
gcc であれば、-pedantic-errors とかするとアレかもしれません。
Re:えらくなく。 (スコア:1)
たしかに -pedantic-errors とすると
bitfeeld.c:4: bit-field `flag1' type invalid in ANSI C
bitfeeld.c:5: bit-field `flag2' type invalid in ANSI C
のようになりますね。
勉強になりました。
Re:えらくなく。 (スコア:1)
C99では、int型の他に、_Bool型(0, 1を保持するのに十分な大きさを持つ整数)もビットフィールドとして許されるようになったようです。
C99は、いろいろとかゆいところに手が届く拡張がなされているので、ビットフィールドも拡張されているかと期待したのですが、どうやら_Boolが仕えるようになっただけのようですね。
/*
C++スタイルのコメント、指定初期化子、enmumリスト中の余分なコンマ、零長配列メンバのためにC99を導入するメリットはあると思っているのでYoh2
でも可変長配列とコンパウンドリテラルは諸刃の剣だよなぁ……(コンパウンドリテラルは使うけどさ)
*/
巧妙に潜伏したバグは心霊現象と区別が付かない。