構造体、共用体は異なるデータをまとめて扱うものでした。一方列挙体は数字を列挙するものです。具体例を見てみましょう。
enum { SUNDAY, MONDAY, TUESDAY };
日曜日から火曜日までを並べただけですが、ここで既に、次のことが定義されています。
SUNDAY = 0 MONDAY = 1 TUESDAY = 2
一番先頭を0にして続く項目が+1、+1.... されていきます。また、先頭を0にしたくない場合は、自由に値を決められます。
enum { SUN = 1, MON, TUE, WED, THU, FRI, SAT };
このとき、SUN=1、MON=2、....SAT=7となります。
最初の値だけでなく、途中の値も設定できます。
enum { SUN = 2, MON, TUE, WED = 1, THU, FRI, SAT = 9 };
この時の値は以下の通りです。
SUM = 2 MON = 3 TUE = 4 WED = 1 THU = 2 FRI = 3 SAT = 9
/* 列挙体の例 */ #include <stdio.h> int main(int argc, char* argv[]){ /* 列挙体定義 */ enum { SUN = 3, MON, TUE, WED }; printf("%d\n",TUE); return 0; }
列挙体はただ数字を列挙させるだけのものですが、この列挙体「型」の変数を作成することができます。
enum DAY { SUN = 1, MON, TUE, WED, THU, FRI, SAT }; enum DAY MyDay;
列挙体「DAY」を定義して、DAY型の変数MyDayを作成しました。MyDay = MONとすれば、MyDay = 1となります。
ただ、DAYのメンバ(SUN〜SAT)はDAY型変数でないと使えないわけではないので、int型変数にTUEを代入できたりします。また、DAY型の変数もSUN〜SAT(1〜9)以外の値をとれないという制約があるわけではなく、列挙型は実は符号無しint型なので、無理に使う必要はありません。ただ、変数をどのような意図で使っているかを明確にするには大いに有効な方法です。
これまで構造体、共用体、列挙体をやってきましたが、それぞれの型の変数を作成する際に、
struct Struct1 MyStruct1; struct Struct1 MyStruct2; union Union1 MyUnion; enum Enum1 MyEnum1; union Union1 MyUnion2; ....
と、毎回struct、union、enumを書くのは面倒です。そこで、struct Struct1などをひとつの型として定義すると便利です。型定義にはtypedefを使用します。
typedef struct Struct1 This_Struct;
これで、struct Struct1はThis_Structとして定義されました。以降、
This_Struct MyStruct1;
と変数を作成できます。
構造体を例にしましたが、共用体、列挙体、その他の変数にも使用することができます。
typedef unsigned short int WORD;
符号無しshort型をWORD型として定義しました。Windowsのアプリでは、こんな型を使用したりします。
以下、列挙体と型定義の例です
/* 列挙体の例2 */ #include <stdio.h> int main(int argc, char* argv[]){ /* 列挙体定義 */ typedef enum boolean{ false, true } BOOL; /* BOOL型を定義した */ BOOL a = true; if(a == true){ printf("True\n"); } else { printf("False\n"); } return 0; }
構造体での使用例も見てみましょう
/* 構造体型定義の例 */ #include <stdio.h> int main(int argc, char* argv[]){ /* 構造体定義 */ typedef struct structv{ int a; int b; } StrV; /* StrV型を定義した */ StrV X; X.a = 10; X.b = 20; printf("%d %d\n",X.a,X.b); return 0; }