enum
が何なのか、いつ使用すべきなのかを根本的に理解していないと思います。
例えば:
typedef enum {
kCircle,
kRectangle,
kOblateSpheroid
} ShapeType;
ここで実際に宣言されているのは何でしょうか?
ベストアンサー1
ここでは 3 つのことが宣言されています。匿名列挙型が宣言され、ShapeType
その匿名列挙の typedef が宣言され、3 つの名前kCircle
、、kRectangle
およびkOblateSpheroid
が整数定数として宣言されています。
詳しく見てみましょう。最も単純なケースでは、列挙型は次のように宣言できます。
enum tagname { ... };
これは、タグ を持つ列挙を宣言しますtagname
。C および Objective-C ( C++は除く) では、これへの参照の前に キーワードを付ける必要がありますenum
。例:
enum tagname x; // declare x of type 'enum tagname'
tagname x; // ERROR in C/Objective-C, OK in C++
どこでもキーワードを使用する必要がないようにするにはenum
、typedef を作成します。
enum tagname { ... };
typedef enum tagname tagname; // declare 'tagname' as a typedef for 'enum tagname'
これは 1 行に簡略化できます。
typedef enum tagname { ... } tagname; // declare both 'enum tagname' and 'tagname'
enum tagname
最後に、キーワードを使用する必要がない場合は、匿名にして、typedef 名のみで宣言するenum
ことができます。enum
typedef enum { ... } tagname;
さて、この場合、 をShapeType
匿名列挙の typedef された名前として宣言しています。ShapeType
は実際には単なる整数型であり、宣言にリストされている値のいずれか (つまり、、、および のいずれか) を保持する変数を宣言するためにのみ使用する必要がありますkCircle
。kRectangle
ただし、キャストによって変数に別の値をkOblateSpheroid
割り当てることができるShapeType
ため、列挙値を読み取るときは注意が必要です。
最後に、、、kCircle
はkRectangle
グローバルkOblateSpheroid
名前空間で整数定数として宣言されます。特定の値が指定されていないため、0 から始まる連続した整数に割り当てられます。つまり、kCircle
は 0、kRectangle
は 1、はkOblateSpheroid
2 です。