列挙型enumを使いこなす

お恥ずかしながら、何か似たような種類の固定の変数や状態などに数値を割り当てるとき、毎回変数を宣言しました。どうやら列挙型enumを使うともっとうまくやれるらしい。

 

 まずは使用例を示します。

#include <stdio.h>

typedef enum Country{
    USA,
    CHINA,
    JAPAN,
    KOLIA,
    
    COUNTRY_NUM
}country;

int main(void) {
    country myCountry=JAPAN;
    printf("myCounty number is %d\n",myCountry);
    printf("The total number of countries is %d\n",COUNTRY_NUM);
    return 0;
}

この出力は

myCounty number is 2
The total number of countries is 4

となります。

つまり、USAから順番に0,1,...と数字が振られ、COUNTRY_NUMに4が振られます。 このように、同じような種類のものをenumでまとめて宣言すると、数字をつけてくれるというイメージです。よく使われる手法ですが、最後に~NUMと入れてenumに入っている数を表したりします。今回だと確かに4ヶ国あります。

注意事項として、

typedef enum Country{
    USA=1,
    CHINA,
    JAPAN,
    KOLIA
}

のようにすると、CHINA=2, JAPAN=3, KOLIA=4と数字が上がってしまうので~NUMで総数をカウントできなくなります。

この列挙型の嬉しいところは、

if(myCountry==0)hoge();//アメリカのとき

とコメントで説明しなくても、

if(myCountry==USA)hoge();

とすれば明らかです。

使いどころは

  • state(OFF=0, ON=1, OTHER=2)
  • direction(CENTER=0, UP= 1, RIGHT=2, DOWN=3, LEFT=4)
  • sex(FEMALE=0, MALE=1, OTHER=2) とかでしょうか。明らかなflagとかはboolで管理した方がいい気もします。

なお、今回はtypedefを用いてenumを使いましたが、様々なenumの宣言方法があります。 Kazuya Hirumaさんの記事:C言語についてメモ

ちなみに、関数の返り値をenum型にすることもできるようです。

#include <stdio.h>

typedef enum Country{
    USA,
    CHINA,
    JAPAN,
    KOLIA,
    
    COUNTRY_NUM
}country;

country hoge_function(int hoge){
    if(hoggee)return USA;
    else if(hogeee)return JAPAN;
    return COUNTRY_NUM;
}