C 言語で typedef enum を使用する
この記事では、C 言語で typedef enum
を使用する方法について複数の方法を示します。
C 言語で名前付き整数定数を定義するために enum
を使用する
キーワード enum
は、列挙と呼ばれる特殊な型を定義します。列挙は基本的に、変数として名前を持つ積分値にすぎませんが、読み取り専用のオブジェクトであり、実行時に変更することはできません。
enum
オブジェクトを作成する方法は 2つあります。1つは、明示的な値を割り当てずに各メンバーを宣言することですが、位置に基づいて自動的に値を推定します。もう 1つは、メンバーを宣言し、明示的な値を割り当てることです。
以下の例では、それぞれにカスタム値を割り当て、オブジェクトに-STATE
という名前を付けています。次に、コード内の STATE
オブジェクトのメンバー名を符号付き整数として使用し、それらを式で評価できます。次のサンプルコードは、入力整数が定義された定数と等しいかどうかをチェックし、一致すると対応する適切な文字列を出力する複数の条件ステートメントを示しています。
#include <stdio.h>
#include <stdlib.h>
enum STATE { RUNNING = 49, STOPPED = 50, FAILED = 51, HIBERNATING = 52 };
int main(void) {
int input1;
printf("Please provide integer in range [1-4]: ");
input1 = getchar();
if (input1 == STOPPED) {
printf("Machine is stopped\n");
} else if (input1 == RUNNING) {
printf("Machine is running\n");
} else if (input1 == FAILED) {
printf("Machine is in failed state\n");
} else if (input1 == HIBERNATING) {
printf("Machine is hibernated\n");
}
exit(EXIT_SUCCESS);
}
出力:
Please provide integer in range [1-4]: 2
Machine is stopped
名前付き整数定数を含むオブジェクトに typedef enum
を用いてカストーム型を定義する
キーワード typedef
は、ユーザ定義のオブジェクトに名前を付けるために使用されます。構造体は、コード中で複数回宣言しなければならないことがよくあります。typedef
を使って定義しないと、各宣言は struct
/enum
キーワードで始まる必要があり、コードの可読性を高めるために非常に負荷が高くなります。
しかし、typedef
は単に新しい型を作成するのではなく、与えられた型の新しいエイリアス名を作成するだけであることに注意してほしい。size_t
や uint
などの多くの整数型は、他の組み込み型の typedef
にすぎません。したがって、ユーザは組み込み型に対して複数の名前のエイリアスを宣言し、既に作成されたエイリアスを使って追加の typedef
宣言を連鎖的に行うことができます。
#include <stdio.h>
#include <stdlib.h>
typedef enum {
RUNNING = 49,
STOPPED = 50,
FAILED = 51,
HIBERNATING = 52
} MACHINE_STATE;
int main(void) {
int input1;
MACHINE_STATE state;
printf("Please provide integer in range [1-4]: ");
input1 = getchar();
state = input1;
switch (state) {
case RUNNING:
printf("Machine is running\n");
break;
case STOPPED:
printf("Machine is stopped\n");
break;
case FAILED:
printf("Machine is in failed state\n");
break;
case HIBERNATING:
printf("Machine is hibernated\n");
break;
default:
break;
}
exit(EXIT_SUCCESS);
}
出力:
Please provide integer in range [1-4]: 2
Machine is stopped