enum in c
cでenumタイプを定義するのは簡単です.
enum _pet_type{DOG, CAT, COW};
ただし、使いやすいようにtypedefを使用して定義できます.
typedef enum _pet_type{DOG, CAT, COW} pet_type;
これでそのまま使えます:pet_type type = DOG;
1.列挙値について
このような定義では,DOGに整数値0が与えられ,後の順に1が加算される.ある要素の整数値を指定することができます.その後の要素は順次1を追加します.
例えばtypedef enum_pet_type{DOG, CAT = 10, COW} pet_type;
ではDOGの値は0,CATは10,COWは11である.
2.列挙値と文字列の交換?
enumについてよくある問題は、文字列と整数値の間で変換する必要があることです.例えば列挙タイプDOGに出会って、数字ではなく文字列「DOG」を表示したいですか?文字列「DOG」を手に入れると、列挙タイプDOG、または整数0に変換するにはどうすればいいですか?
Enumの原理を知ると、直接変換は不可能であることがわかります.cではenumはマクロに似ているため、例えばdefine DOG 0が定義されており、前処理をコンパイルする際にすべてのDOGが0に置き換えられている.Enumと同様に、列挙された各シンボル(DOG、CAT、COW)は数字に置き換えられ、実行期間中は0、1、2の数字しか存在せず、列挙シンボルDOG、CATなどの情報は全く存在しない.だから簡単な直接的な変換は不可能で、自分で書くしかありません.
たとえば、列挙タイプから対応する文字列を取得し、変換関数を手動で書きます.
同様に、文字列から列挙数字への変換関数を書くことができます.もちろん、列挙タイプが多く、すべての列挙値が連続している場合は、簡単に書くことができます.
3. EnumでのENUMの定義COUNT
列挙タイプの数が使用される場合があります.ハードコーディングと使用される場合があります.この場合、enumで要素ENUM_を定義できます.COUNT.デフォルトでは対応する整数値が自動的に1ずつ加算されるため、この値はenumタイプの数を表します.
typedef enum _pet_type{DOG, CAT, COW, PET_COUNT}pet_type; このように列挙タイプを削除すると、すべてのPET_COUNTの参照は修正する必要はありません.
enum _pet_type{DOG, CAT, COW};
ただし、使いやすいようにtypedefを使用して定義できます.
typedef enum _pet_type{DOG, CAT, COW} pet_type;
これでそのまま使えます:pet_type type = DOG;
1.列挙値について
このような定義では,DOGに整数値0が与えられ,後の順に1が加算される.ある要素の整数値を指定することができます.その後の要素は順次1を追加します.
例えばtypedef enum_pet_type{DOG, CAT = 10, COW} pet_type;
ではDOGの値は0,CATは10,COWは11である.
2.列挙値と文字列の交換?
enumについてよくある問題は、文字列と整数値の間で変換する必要があることです.例えば列挙タイプDOGに出会って、数字ではなく文字列「DOG」を表示したいですか?文字列「DOG」を手に入れると、列挙タイプDOG、または整数0に変換するにはどうすればいいですか?
Enumの原理を知ると、直接変換は不可能であることがわかります.cではenumはマクロに似ているため、例えばdefine DOG 0が定義されており、前処理をコンパイルする際にすべてのDOGが0に置き換えられている.Enumと同様に、列挙された各シンボル(DOG、CAT、COW)は数字に置き換えられ、実行期間中は0、1、2の数字しか存在せず、列挙シンボルDOG、CATなどの情報は全く存在しない.だから簡単な直接的な変換は不可能で、自分で書くしかありません.
たとえば、列挙タイプから対応する文字列を取得し、変換関数を手動で書きます.
static char *enum_to_name(pet_type type){
switch(type){
case DOG:
return "DOG";
case CAT:
return "CAT";
case COW:
return "COW";
default:
return NULL;
}
}
int main (int argc, char const *argv[])
{
char *name = enum_to_name(DOG);
printf("DOG name is \"%s\"
", name);
return 0;
}
同様に、文字列から列挙数字への変換関数を書くことができます.もちろん、列挙タイプが多く、すべての列挙値が連続している場合は、簡単に書くことができます.
typedef enum _pet_type{DOG, CAT, COW}pet_type;
static pet_type get_pet_type(char *data){
char map[][4] = {"DOG", "CAT", "COW"};
int i;
for (i = 0; i < 3; ++i)
{
if (strcmp (map[i], data) == 0)
{
return i;
}
}
return -1;
}
int main (int argc, char const *argv[])
{
pet_type type = get_pet_type("DOG");
printf("\"DOG\" type is %d
", type);
return 0;
}
3. EnumでのENUMの定義COUNT
列挙タイプの数が使用される場合があります.ハードコーディングと使用される場合があります.この場合、enumで要素ENUM_を定義できます.COUNT.デフォルトでは対応する整数値が自動的に1ずつ加算されるため、この値はenumタイプの数を表します.
typedef enum _pet_type{DOG, CAT, COW, PET_COUNT}pet_type; このように列挙タイプを削除すると、すべてのPET_COUNTの参照は修正する必要はありません.