1. ホーム
  2. objective-c

[解決済み] Objective-Cのtypedef enumとは何ですか?

2022-03-17 17:31:30

質問

を根本的に理解していないようです。 enum は、どのような場合に使用するのでしょうか?

例えば

typedef enum {
    kCircle,
    kRectangle,
    kOblateSpheroid
} ShapeType;

ここで本当に宣言されていることは何でしょうか?

どのように解決するのか?

ここでは、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 と共に enum キーワードを使用すると enum を匿名にし、typedef名で宣言するだけです。

typedef enum { ... } tagname;

さて、この場合、宣言しているのは ShapeType を無名列挙型の型付けされた名前にします。 ShapeType は実際には単なる積分型であり、宣言で列挙された値のうちのひとつを保持する変数を宣言するためにのみ使用されるべきものです。 kCircle , kRectangle および kOblateSpheroid ). を割り当てることができます。 ShapeType 変数にキャストすることで別の値を得ることができます。

最後に kCircle , kRectangle および kOblateSpheroid は、グローバル名前空間で積分定数として宣言されています。 具体的な値が指定されていないので,0から始まる連続した整数に代入される. kCircle は0です。 kRectangle は1、そして kOblateSpheroid は2である。