12
  • 列挙型は「定数の名前付きコレクション」です。 enum MyType_e {A, B, C};
  • これらの定数は、列挙型の親スコープで宣言されます。つまり、列挙型がファイル スコープで宣言され、名前が付けられていない場合、一連の eg#define A 0ステートメント と同等です。
  • 列挙型定数の基になる型は常に、intつまりint var = A完全に合法ですvarが、型ではありませんMyType_e

では、列挙名はどのような目的に役立つのでしょうか?

編集 以下のコメントによると、列挙型の私の理解にはかなり欠陥があるようです。列挙型は #define ステートメントとは関係ありません。 列挙型はコンパイル時に解決され、型付けされます。

4

3 に答える 3

8

タイプを使用すると、enum意図が伝わります。

enum引数として定数を取る関数があるとします。

void foo(enum MyType_e e);

有効な入力とは何かについて自己文書化していますが、

void foo(int e);

ではありません。さらに、型に互換性のない値を渡そうとすると、コンパイラが警告を発行する場合がありますenum。ISO C99 仕様の付属書 I (「一般的な警告」) から:

実装は、多くの状況で警告を生成する可能性があります.... 以下は、より一般的な状況のいくつかです。

[...]

  • その型のメンバーである列挙定数、同じ型を持つ列挙変数、または同じ列挙型を返す関数の値 ( 6.7.2.2)。

一部のコンパイラ (gcc など)switchでは、enum型に対して使用しても、そのすべての定数の処理を怠り、大文字と小文字が区別されないdefault場合、警告が生成されることさえあります。

于 2013-04-15T06:40:58.893 に答える
3

あなたは完全に言うことができますが

int var = A

バリアント

enum mytype var = A

文書上の理由からより優れています。

于 2013-04-15T06:16:58.460 に答える