C LANGUAGE TECHNOLOGY

【C言語】列挙型enumの使い方と実例

悩んでいる人

C言語の列挙型enumの使い方と実例を教えて!

こういった悩みにお答えします.

本記事の信頼性

  • リアルタイムシステムの研究歴12年.
  • 東大教員の時に,英語でOSの授業.
  • 2012年9月~2013年8月にアメリカのノースカロライナ大学チャペルヒル校コンピュータサイエンス学部2021年の世界大学学術ランキングで20位)で客員研究員として勤務.C言語でリアルタイムLinuxの研究開発
  • プログラミング歴15年以上,習得している言語: C/C++Solidity,Java,Python,Ruby,HTML/CSS/JS/PHP,MATLAB,Assembler (x64,ARM).
  • 東大教員の時に,C++言語で開発した「LLVMコンパイラの拡張」,C言語で開発した独自のリアルタイムOS「Mcube Kernel」GitHubにオープンソースとして公開

こういった私から学べます.

列挙型enum

列挙型enumを利用すると,ある定数のまとまりを新しい型として取り扱うことができます.

列挙型は「整数定数」のリストとして扱われます.

列挙型の各要素に明示的に値を設定しない場合,最初の要素から順番に,0,1,2,…という値を持ちます.

例えば,教科を表す定数のまとまりの型としてenum subject型を定義します.

以下の場合は,ENGLISHが0,MATHEMATICSが1,SCIENCEが2,ALLが3という値を持ちます.

列挙型で明示的に値を設定する場合は,代入演算子「=」を利用します.

例えば,enum subject型で以下のように値を設定します.

また,全ての値が指定されていないときには,最後に指定された値から順番に1ずつ増えていきます.

例えば,以下のように定義したとします.

このとき,ENGLISHは0で,MATHEMATICSは5,SCIENCEは6,ALLは7になります.

列挙型の要素の値はコード内では重要ではなく,名前毎にユニークな整数定数を設定できることが重要です.

列挙型をわざわざ使わなくてもint型の1は英語,2は数字を表す等と決めてコードを作成することは可能です.

しかし,コードを作成している人には意味がわかりづらく,デバッグしにくくなってしまいます.

そこで,列挙型を利用し,関数の引数にENGLISHを渡すことで,英語を意味していることがわかります.

また,#defineでENGLISHやMATHEMATICS等を定数マクロで定義する場合は,同じ値を設定してしまうバグが発生する可能性がありますが,そのバグを列挙型は回避することができます.

※列挙型で明示的に同じ値を設定した場合は,このバグを回避できないことに注意して下さい.列挙型は同じ値を設定できます.

列挙型の変数は,構造体の場合と同様に利用できます.

例えば,以下のようにenum subject型の列挙型の変数sbjを定義します.

変数sbjはENGLISHやMATHEMATICS等を参照できます.

列挙型enumの使い方

enum subject型を利用するコードは以下になります.

このコードは,入力した数字0~3に対応した教科名を表示します.

0~3以外の場合は「Error: 4 is not a subject ID.」と表示します.

実行結果は以下になります.

3行目の行末で0を入力した時は4行目で「English」,6行目の行末で4を入力した時は7行目で「Error: 4 is not a subject ID.」と表示されていることがわかります.

列挙型enumのポインタ型の使い方

列挙型enumのポインタ型の使い方を紹介します.

他のデータ型と同様に,列挙型enumもポインタ型で関数の引数に設定できます.

列挙型enumのポインタ型を利用するコードは以下になります.

get_day_of_week関数の引数に列挙型enum day_of_weekのポインタ型を設定しています.

実行結果は以下になります.

3行目の行末に3と入力したら,Wednesdayと表示されていることがわかります.

列挙型enumのLinuxカーネルにおける実例

列挙型enumのLinuxカーネルにおける実例を紹介します.

include/linux/sched/idle.hでenum cpu_idle_type型が以下のように定義されています.

ここで,CPU_IDLE,CPU_NOT_IDLE,CPU_NEWLY_IDLEがタイプを表し,CPU_MAX_IDLE_TYPESがcpu_idle_typeの個数(値は3)を表します.

enum cpu_idle_type型は,kernel/sched/stats.cのshow_schedstat関数で利用されています.

32行目でenum cpu_idle_type型の変数itypeを定義しています.

36~47行目のfor文でitypeを制御変数とし,itypeがCPU_MAX_IDLE_TYPES未満であればループの中身を実行します.

Linuxカーネルを学びたいあなたは,こちらからどうぞ.

Linuxカーネル
元東大教員から学ぶLinuxカーネル

こういった私から学べます. Linuxカーネルとは,C言語で開発されたオープンソースのOSです. Linuxカーネルは主に以下のコンピュータで広く利用されています. スーパーコンピュータ サーバ An ...

続きを見る

まとめ

C言語で列挙型enumの使い方とLinuxカーネルにおける実例を紹介しました.

列挙型enumはユニークな定数のリストを作成したい時に便利なので,是非使いましょう!

C言語を独学で習得することは難しいです.

私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.

友だち追加

独学が難しいあなたは,C言語を学べるおすすめのオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!

-C LANGUAGE, TECHNOLOGY
-, , , , , , , , ,