enum in c

2226 ワード

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などの情報は全く存在しない.だから簡単な直接的な変換は不可能で、自分で書くしかありません.
 
たとえば、列挙タイプから対応する文字列を取得し、変換関数を手動で書きます.
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の参照は修正する必要はありません.