C enum の最後のコンマは必要ですか?

必須ではありません。セクション 6.7.2.2 C99 の構文は次のようにリストされています:

enum-specifier:
    enum identifieropt { enumerator-list }
    enum identifieropt { enumerator-list , }
    enum identifier
enumerator-list:
    enumerator
    enumerator-list , enumerator
enumerator:
    enumeration-constant
    enumeration-constant = constant-expression

enum-specifier の最初の 2 つの形式に注意してください 、末尾のコンマがあるものとないもの。

これを使用する利点の 1 つは、次のようなものです。

enum {
    Val1,
    Val2,
    Val3,
} someEnum;

どこに、(たとえば) Val4 を追加する場合 と Val5Val3 をコピーして貼り付けるだけです カンマの調整を気にする必要はありません。

自動化されたコード ジェネレーターを単純化して、最終的な値を特別に処理する必要がないようにすることもできます。すべての値の後にカンマを付けて出力するだけです。

これはよく見られる SQL にたとえることができます:

select fld1, fld2 from tbl where 1=1 and fld1 > 8

その場合、where 1=1 where を配置する必要がないようにするためだけに存在します 最初の節と and の前に 後続の各前。 where という事実に頼ることができます and を使用するだけです

これは怠惰の臭いだと思う人もいるかもしれませんが、それは正しいことですが、それは必ずしも悪いことではありません :-)

適切な DBMS クエリ オプティマイザーは、データベース テーブルに移動する前に、そのような定数句を取り除くことができるはずです。


誰もが言うように、カンマは必要ありません。しかし、これは C99 の新機能 (C89 では許可されていませんでした) であり、C++ の次のバージョンでも許可される予定です。

もう 1 つの理由は、「長さ」列挙子と通常の列挙子を区別することです。

enum Items {
    A,
    B,
    C,
    LENGTH
};

これで、列挙の最後の項目にコンマを適用する必要があることをコーディング ガイドラインに入れることができますが、それが「長さ」項目である場合はそうではありません。

また、他の回答で説明されているように、アイテムの自動生成(マクロ/プリプロセッサを使用)にも役立ちます。


標準 C89 では、最後のコンマは許可されていません。終止符。

それを許可するのは一般的な拡張機能でした。特に、GCC ではサポートされていましたが、標準では明示的に禁止されていました。

標準 C99 では、配列および構造初期化子との対称性のために、最後の項目の末尾のコンマを常に許可していましたが、最後のコンマが許可されています。

末尾のコンマを許可することの主な利点は、(C ソース) コードのマシン生成が容易になることです。イニシャライザのリストの最後 (または、おそらく最初) の項目に対して特別なケースのコードを記述する必要はありません。したがって、Yacc や Lex などの 2 つだけを挙げたプログラムは、もう少し単純にすることができます。