"Для меня теги типов и имена переменных для перечислений выглядят довольно избыточными ..."
Значение при использовании последовательного набора именованных целочисленных значений в форме перечислимых список (enum
) может показаться на первый взгляд тонким, но становится очень очевидным при использовании в C проектах по нескольким причинам:
- имен , связанных с перечислимый список обеспечивает самодокументируемый код, то есть, в частности, когда набор имен, выбранных для представления набора перечисляемых значений, образует тему, связанную с поставленной задачей. (Ваше животное
enum
является хорошим примером, поскольку он может использоваться для перечисления, например, большого списка команд или типов позиций в компании.) - Назначение значений по умолчанию в перечисляемом списке: последовательный, начиная с 0, и увеличивается на единицу до конца списка, что приводит к появлению списка уникальных значений, очень хорошо подходящих для использования при индексации массива строк с особым значением или при использовании в операторе
switch
в качестве постоянного целочисленного значения для каждого из операторов case
.
А что касается комментария: "... но преимущество использования типа ANML
вместо int
минимально, ..."
* 1024 Списки *
enum
также предоставляют документированное ограничение
. Например, использование
ANML anml;
вместо
int anml;
в качестве члена
struct
быстро покажет тем, кто будет поддерживать / обновлять исходный код (в ближайшие месяцы или годы), что существует связанный список связанных значений, которые этот член ограничен в использовании, а не любое случайное целочисленное значение. Это важно, когда будет использоваться перечисляемый список, например. в операторе switch, предназначенном только для обработки набора
case
операторов, которые соответствуют постоянным целочисленным значениям в этом
enum
.
Эти два вместе являются частью варианта использования, который я нашел особенно полезно, т. е. использовать перечисления в сочетании со строковыми массивами для выбора контента для пользовательского интерфейса или для поиска по подстроке, например: c.
, например:
typedef enum {
CAT,
DOG,
FISH,
MAX_ANML
}ANML;//for use in struct
char *strings[MAX_ANML] = {"cat","dog","fish"};
typedef struct {
char content[80];
ANML anml;
}SEARCH;
Где, например, эти две конструкции могут быть использованы вместе с оператором switch
:
bool searchBuf(SEARCH *animal)
{
bool res = FALSE;
switch (animal->anml) {
case CAT:
//use the string animal[type] for a search, or user interface content, etc.
if(strstr(animal->content, strings[CAT]))
res = TRUE;
break;
case DOG:
if(strstr(animal->content, strings[DOG]))
res = TRUE;
break;
case FISH:
if(strstr(animal->content, strings[FISH]))
res = TRUE;
break;
};
return res;
}
int main(void)
{
char buffer[] = {"this is a string containing cat."};
SEARCH search;
strcpy(search.content, buffer);
search.anml = CAT;
bool res = searchBuf(&search);
//use res...
return 0;
}