※本記事は広告を含みます。
C言語文法解説シリーズ
本記事は「C言語文法解説シリーズ」の1つです。
C言語の文法を、組み込み開発の視点も交えて解説します。
C言語の enum は、意味のある整数に名前を付ける仕組みです。
たとえば次のようなコードを見てください。
int mode = 1;
if (mode == 1) {
start();
}このコード、動きは分かりますが 1 が何を意味しているか分かりません。
- 1 = START?
- 1 = RUN?
- 1 = ERROR?
こういう「意味不明な数字」を防ぐために使うのが enum です。
enum の基本
enum Mode {
STOP,
RUN,
ERROR
};これは次の意味になります。
STOP = 0
RUN = 1
ERROR = 2つまり enum は
名前付き整数定数の集まり
です。
enum を使うとこうなる
enum Mode mode;
mode = RUN;
if (mode == RUN) {
start();
}一気に読みやすくなります。
数値の意味がコードから分かるようになります。
初心者さんenumって結局何ですか?



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



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



そう。実体は int として扱われるよ
これ、重要ポイントです。
enum は整数です
クラスでも型でもありません。
ただの整数です。
enum は自動で 0 から割り当てられる
enum State {
INIT,
IDLE,
RUNNING,
ERROR
};これはこうなります。
INIT = 0
IDLE = 1
RUNNING = 2
ERROR = 3自動で +1 されます。
値を自分で指定することもできる
enum State {
INIT = 10,
IDLE,
RUNNING,
ERROR
};こうなります。
INIT = 10
IDLE = 11
RUNNING = 12
ERROR = 13途中だけ指定もできます。
enum State {
INIT,
IDLE,
RUNNING = 10,
ERROR
};結果
INIT = 0
IDLE = 1
RUNNING = 10
ERROR = 11enum は int と同じように使える
enum は整数なのでこういうこともできます。
enum Mode mode = RUN;
if (mode == 1) {
start();
}動きます。
でもこれは やらない方がいい です。
せっかく enum を使っているのに意味がなくなります。
OK
if (mode == RUN)NG
if (mode == 1)typedef と組み合わせるとさらに読みやすい
C言語の enum はちょっと書きにくいです。
enum Mode mode;毎回 enum を書く必要があります。
そこで typedef を使います。
typedef enum {
STOP,
RUN,
ERROR
} Mode;こうすると
Mode mode;と書けます。
かなり実務ではこの形が多いです。



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



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



struct と同じ感じですか?



そうそう、その理解でOK
typedefの使い方についてはこちらの記事で解説しています。
enum がよく使われる場面
状態管理
typedef enum {
STATE_INIT,
STATE_IDLE,
STATE_RUN,
STATE_ERROR
} State;組み込みでは超よく使います。
モード指定
typedef enum {
MODE_MANUAL,
MODE_AUTO
} Mode;戻り値
typedef enum {
RESULT_OK,
RESULT_ERROR,
RESULT_TIMEOUT
} Result;enum を使うメリット
① 可読性が上がる
if (mode == RUN)② バグを減らせる
意味不明な数値を防げる
③ 状態管理しやすい
組み込みでは特に重要
enum 使用時の注意点
enum は整数
これが一番大事です。
つまりこういうこともできてしまいます。
Mode mode = 100;普通にコンパイル通ります。
enum だからといって
値が制限されるわけではありません。
ここは初心者が勘違いしやすいポイントです。



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



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



じゃあ変な値も入る?



入る。そこは設計で防ぐしかない
C言語とC++では enum の扱いが異なる
C言語とC++では、enum の型の扱いが少し異なります。
まず C言語の場合です。
enum Mode {
STOP,
RUN,
ERROR
};
enum Mode mode;C言語では、型名は enum Mode になります。
そのため、変数宣言のときも enum を付ける必要があります。
一方、C++では enum を付けなくても使えます。
enum Mode {
STOP,
RUN,
ERROR
};
Mode mode;C++では Mode がそのまま型名として扱われます。
この違いは struct でも同じです。
C言語
struct Person {
int age;
};
struct Person p;C++
struct Person {
int age;
};
Person p;このように、C++の方がシンプルに書けます。
そのため、C言語では C++ と同じように使えるようにtypedef を使う書き方がよく使われます。
typedef enum {
STOP,
RUN,
ERROR
} Mode;
Mode mode;実務では、この書き方が一般的です。
まとめ
enum は
- 名前付き整数定数
- 可読性を上げるための仕組み
- 状態管理に便利
- typedef と組み合わせて使うことが多い
- でも実体は整数
C言語ではとてもよく使う文法です。
特に組み込みでは 状態管理で必須レベル です。
この記事が参考になった方へ
技術に関するご相談・開発・自動化ツール作成・記事執筆などのご依頼も承っています。
小さなご相談からでもお気軽にご連絡ください。









コメント