値をビットマスクとして使用するような巧妙なことをしていない場合は、列挙された定数に割り当てる値をコンパイラに選択させるだけでよいと以前に聞いたことがあります。より明示的なコードドキュメントに列挙値を使用している場合、すべての値を明示的に定義しないと忍び寄る可能性のある落とし穴はありますか?値は昇順で割り当てられていると思います。連続する各コンパイルで同じ値を確保するために、最初の値を定義する必要がありますか?
2 に答える
C99、セクション6.7.2.2p3から:
列挙子リストの識別子は、int型の定数として宣言されており、許可されている場合はどこにでも表示できます。=の列挙型は、その列挙定数を定数式の値として定義します。最初の列挙子に=がない場合、その列挙定数の値は0です。=がない後続の各列挙子は、前の列挙定数の値に1を加算して得られる定数式の値として列挙定数を定義します。(=で列挙子を使用すると、同じ列挙内の他の値と重複する値を持つ列挙定数が生成される場合があります。)
最初の列挙子に値を割り当てる必要があるのは、その値をとは異なるものにする場合のみです0
。列挙子は配列のインデックス付けによく使用されるため、通常はこれを行いません。
以下は、「前の値に1を加算する」の簡単な例です。
enum {
A,
B,
C = 0,
D,
E
};
int main ()
{
printf("%d\n", A);
printf("%d\n", B);
printf("%d\n", C);
printf("%d\n", D);
printf("%d\n", E);
return 0;
}
上記のプログラムの出力は次のとおりです。
0
1
0
1
2
私が考えることができる唯一の「落とし穴」は、複数のenum
名前で同じ値を表す場合は、エイリアスするアイテムのすぐ横、またはenum
リストの一番下にそれらを貼り付けることを忘れないでください。enum
行を数えて値がどうなるかを予測できるように、後者の方が好きenum
です。
enum {
A,
B,
E,
/* aliases below */
C = A,
D = B
};
それ以外の場合、列挙子はint
文字通りのようになります。
タイプの使い方にもよると思います。
初期化子を提供しないことの利点enum
:
- 開発時に値を追加および削除するのが簡単です。
- 同じ値で2つの識別子を誤って定義することはありません。
初期化子を提供する利点enum
:
- データを安全にシリアル化および逆シリアル化できます。これらの値をファイルやネットワークソケットなどに入れる必要がある場合は、先に進んで値を書き込みます。
- デバッグ目的で値を検索するのが簡単です。