C言語のenumとは?整数との違いと使いどころをわかりやすく解説

目次

C言語文法解説シリーズ

本記事は「C言語文法解説シリーズ」の1つです。
C言語の文法を、組み込み開発の視点も交えて解説します。

C言語の enum は、意味のある整数に名前を付ける仕組みです。

たとえば次のようなコードを見てください。

C
int mode = 1;

if (mode == 1) {
    start();
}

このコード、動きは分かりますが 1 が何を意味しているか分かりません。

  • 1 = START?
  • 1 = RUN?
  • 1 = ERROR?

こういう「意味不明な数字」を防ぐために使うのが enum です。


enum の基本

C
enum Mode {
    STOP,
    RUN,
    ERROR
};

これは次の意味になります。

C
STOP  = 0
RUN   = 1
ERROR = 2

つまり enum は

名前付き整数定数の集まり

です。


enum を使うとこうなる

C
enum Mode mode;
mode = RUN;

if (mode == RUN) {
    start();
}

一気に読みやすくなります。

数値の意味がコードから分かるようになります。

初心者さん

enumって結局何ですか?

エンジニアくん

意味のある整数に名前を付ける仕組みだよ

初心者さん

じゃあ中身は整数なんですか?

エンジニアくん

そう。実体は int として扱われるよ

これ、重要ポイントです。

enum は整数です

クラスでも型でもありません。
ただの整数です。


enum は自動で 0 から割り当てられる

C
enum State {
    INIT,
    IDLE,
    RUNNING,
    ERROR
};

これはこうなります。

C
INIT    = 0
IDLE    = 1
RUNNING = 2
ERROR   = 3

自動で +1 されます。


値を自分で指定することもできる

C
enum State {
    INIT = 10,
    IDLE,
    RUNNING,
    ERROR
};

こうなります。

C
INIT    = 10
IDLE    = 11
RUNNING = 12
ERROR   = 13

途中だけ指定もできます。

C
enum State {
    INIT,
    IDLE,
    RUNNING = 10,
    ERROR
};

結果

C
INIT    = 0
IDLE    = 1
RUNNING = 10
ERROR   = 11

enum は int と同じように使える

enum は整数なのでこういうこともできます。

C
enum Mode mode = RUN;

if (mode == 1) {
    start();
}

動きます。

でもこれは やらない方がいい です。

せっかく enum を使っているのに意味がなくなります。

OK

C
if (mode == RUN)

NG

C
if (mode == 1)

typedef と組み合わせるとさらに読みやすい

C言語の enum はちょっと書きにくいです。

C
enum Mode mode;

毎回 enum を書く必要があります。

そこで typedef を使います。

C
typedef enum {
    STOP,
    RUN,
    ERROR
} Mode;

こうすると

C
Mode mode;

と書けます。

かなり実務ではこの形が多いです。

初心者さん

enum と typedef は一緒に使うんですか?

エンジニアくん

実務ではセットで使うことが多いね

初心者さん

struct と同じ感じですか?

エンジニアくん

そうそう、その理解でOK

typedefの使い方についてはこちらの記事で解説しています。


enum がよく使われる場面

状態管理

C
typedef enum {
    STATE_INIT,
    STATE_IDLE,
    STATE_RUN,
    STATE_ERROR
} State;

組み込みでは超よく使います。


モード指定

C
typedef enum {
    MODE_MANUAL,
    MODE_AUTO
} Mode;

戻り値

C
typedef enum {
    RESULT_OK,
    RESULT_ERROR,
    RESULT_TIMEOUT
} Result;

enum を使うメリット

① 可読性が上がる

C
if (mode == RUN)

② バグを減らせる

意味不明な数値を防げる

③ 状態管理しやすい

組み込みでは特に重要


enum 使用時の注意点

enum は整数

これが一番大事です。

つまりこういうこともできてしまいます。

C
Mode mode = 100;

普通にコンパイル通ります。

enum だからといって
値が制限されるわけではありません。

ここは初心者が勘違いしやすいポイントです。

初心者さん

え、enumって安全じゃないんですか?

エンジニアくん

C言語ではただの整数だからね

初心者さん

じゃあ変な値も入る?

エンジニアくん

入る。そこは設計で防ぐしかない


C言語とC++では enum の扱いが異なる

C言語とC++では、enum の型の扱いが少し異なります。

まず C言語の場合です。

C
enum Mode {
    STOP,
    RUN,
    ERROR
};

enum Mode mode;

C言語では、型名は enum Mode になります。
そのため、変数宣言のときも enum を付ける必要があります。

一方、C++では enum を付けなくても使えます。

C
enum Mode {
    STOP,
    RUN,
    ERROR
};

Mode mode;

C++では Mode がそのまま型名として扱われます。

この違いは struct でも同じです。

C言語

C
struct Person {
    int age;
};

struct Person p;

C++

C
struct Person {
    int age;
};

Person p;

このように、C++の方がシンプルに書けます。

そのため、C言語では C++ と同じように使えるように
typedef を使う書き方がよく使われます。

C
typedef enum {
    STOP,
    RUN,
    ERROR
} Mode;

Mode mode;

実務では、この書き方が一般的です。

まとめ

enum は

  • 名前付き整数定数
  • 可読性を上げるための仕組み
  • 状態管理に便利
  • typedef と組み合わせて使うことが多い
  • でも実体は整数

C言語ではとてもよく使う文法です。
特に組み込みでは 状態管理で必須レベル です。

この記事が参考になった方へ

技術に関するご相談・開発・自動化ツール作成・記事執筆などのご依頼も承っています。

小さなご相談からでもお気軽にご連絡ください。

お問い合わせはこちら

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする


目次