enum 〜整数の定数に名前をつける〜


目次に戻る


#define を紹介したときに数値データなどは #define を使って名前をつけるべきだと書き ました。しかし、switch〜caseでの分岐をするときなどは #define を使うよりもむしろ enum を使って列挙型を定義してしまう場合の方がよいです。
 
enum TMyState {
   msIdle,
   msMenu,
   msAction,
   msDefault,
};

int RunNowState( int state )
{
   int result;

   switch( state ){
      case msIdle:
          &nb sp;  :
          break;
      case msMenu:
          &nb sp;  :
          break;
      case msAction:
          &nb sp;  :
          break;
      case msDefault:
          &nb sp;  :
          break;
   }
   return result;
}

enumを使うことのよい利点は別にもあります。それは、自動的に数値を決定してくれるか らです。例えば
 
#define FLAG_GO   0
#define FLAG_ACT  1
#define FLAG_NOT  2
#define FLAG_ADD  3
のように数値が連続する場合は
enum TFlag {
    FLAG_GO,
    FLAG_ACT,
    FLAG_NOT,
    FLAG_ADD,
};
と書いても同じ意味になります。例え連続していなくても、 = XXX をつけることで、名前が 意味する値を直接設定することができます。
enum TFlag2 {
   FLAG2_GO = 1,
   FLAG2_ACT = 2,
   FLAG2_NOT = 4,
   FLAG2_ADD = 8,
};
面白いのは次のような使い方もできるという事です。
 
/* #define を使った場合 */
#define IMAGE_HEADER_FORMAT   2000
#define IMAGE_HEADER_SCAN     2001
#define IMAGE_HEADER_TABLE    2002
#define IMAGE_HEADER_TABLE2   2003

#define MUSIC_HEADER_FORMAT   3000
#define MUSIC_HEADER_SCAN     3001
#define MUSIC_HEADER_IO       3002
#define MUSIC_HEADER_SIGNAL   3003
 

/* enum を使った場合(上の例と同値) */
enum THeaderMarker {
   IMAGE_HEADER_FORMAT = 2000,
   IMAGE_HEADER_SCAN,
   IMAGE_HEADER_TABLE,
   IMAGE_HEADER_TABLE2,

   MUSIC_HEADER_FORMAT = 3000,
   MUSIC_HEADER_SCAN,
   MUSIC_HEADER_IO,
   MUSIC_HEADER_SIGNAL,
};

追伸
最後に紹介した使用例はさっきプログラミング言語C第2版を読んで初めて知りまし た。C言語はまだまだ奥が深いです。


目次に戻る