ユーニックス総合研究所

  • home
  • archives
  • c-enum-typedef

C言語でenumをtypedefして使う【列挙型】

  • 作成日: 2022-12-22
  • 更新日: 2023-12-24
  • カテゴリ: C言語

C言語でenumをtypedefする

C言語には「enum」という列挙型定数を定義するための文があります。
これを使うと定数を定義できます。

このenumをさらにtypedefすると列挙型定数の新しい型が作れます。
列挙型を新しい型にすることで列挙定数をその型の値として扱うことができるようになります。

具体的には↓のようにします。

typedef enum {  
    ZERO,  
    ONE,  
    TWO,  
} Number;  

この記事ではenumをtypedefする方法を具体的に解説します。

関連記事
C言語のenumはあなたの仕事を3倍効率的にします

普通のenumのおさらい

まず普通のenumですが、これは↓のように使います。

#include <stdio.h>  

enum Number {  
    ZERO,  
    ONE,  
    TWO,  
};  

int main(void) {  
    enum Number n = ONE;  
    int nn = TWO;  

    printf("%d\n", n);  
    printf("%d\n", nn);  

    return 0;  
}  

ZEROとかONEなどが列挙型定数です。
この定数は「enum Number n = ONE;」のように変数に入れておくことができます。
またint型の整数にも「int nn = TWO;」のように入れておけます。

これらは実際には型はintになります。
ですのでprintf()でも整数として出力することができます。

typedefしたenumについて

enumをtypedefした場合は↓のようになります。

#include <stdio.h>  

typedef enum {  
    ZERO,  
    ONE,  
    TWO,  
} Number;  

int main(void) {  
    Number n = ONE;  
    int nn = TWO;  

    printf("%d\n", n);  
    printf("%d\n", nn);  

    return 0;  
}  

変数を定義する場合は

    Number n = ONE;  

となって「enum」が無くなっています。
これはtypedefによって列挙型がNumberという型になっているからです。

enumの実体は整数でした。
そのためこのtypedefしたNumberも実体は整数になります。
整数型にNumberという別名の型を付けているだけなんですね。

ですのでprintf()でも整数として出力することができます。

typedefしたenumのサイズは?

typedefしたenumのサイズは何バイトになるのでしょうか?
これはsizeof()演算子で確認できます。

#include <stdio.h>  

typedef enum {  
    ZERO,  
    ONE,  
    TWO,  
} Number;  

int main(void) {  
    printf("%ld\n", sizeof(Number));  // 4  
    return 0;  
}  

結果は4バイトになりました。
これはint型と同じバイト数です。
(ただしint型のサイズは環境によって変わることがあります)

おわりに

今回はtypedefしたenumについて解説しました。
enumをtypedefするとコードがカッコ良くなりますよね。
なにか参考になれば幸いです。

🦝 < enumをtypedef!

🐭 < 型を作っちゃう!