C 言語で typedef enum を使用する

胡金庫 2023年10月12日
  1. C 言語で名前付き整数定数を定義するために enum を使用する
  2. 名前付き整数定数を含むオブジェクトに typedef enum を用いてカストーム型を定義する
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_tuint などの多くの整数型は、他の組み込み型の 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
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook