Typedef enum, определяя значение внутри

компиляция с gcc C99

Я использую enums на некоторое время. Тем не менее, я использую образец кода для разработки моего приложения. И я натолкнулся на такой код. Мне сообщили, что это лучшая практика при использовании перечислений. Но я не вижу, как это имеет какие-то преимущества.

typedef enum {
    TYPE_DATE,
    TYPE_TIME,
    TYPE_MONEY,

    TYPE_COUNT,
    TYPE_UNKNOWN = TYPE_COUNT
} string_type_e;

Почему есть TYPE_COUNT и зачем присваивать TYPE_COUNT до TYPE_UNKNOWN?

Большое спасибо за любые предложения,

Ответ 1

По умолчанию перечислениям автоматически присваиваются целочисленные значения, начиная с 0 компилятором. Таким образом, дата будет равна нулю, времени одному и двум деньгам. Следующее значение присваивается значению "psuedo" enum TYPE_COUNT, которое получит значение три, которое, как оказалось, будет числом "правильных" значений перечисления.

TYPE_UNKNOWN - это другое значение, которое представляет собой нечто, не являющееся "правильным" значением, поэтому не пройдет тест e < TYPE_COUNT. Если он равен TYPE_COUNT, означает, что каждое отдельное значащее значение смежно, но я не знаю какого-либо существенного преимущества для него (было бы, если бы TYPE_COUNT было меньше чем 2, что могло бы повлиять на то, какое представление компилятор мог бы использовать, а его "хороший" имел бы смежные значения, но это не имеет особого значения, так как вы не увеличивали бы их до конца TYPE_COUNT)

Ответ 2

Значения enum представляют собой в основном целочисленные константы. По умолчанию им присваивается значение последнего элемента в перечислении + 1 (и 0 для первого элемента). Когда вы хотите подсчитать элементы, которые могут быть полезны для сопоставления с массивом или чем-то еще, объявленного таким образом перечисления (который будет динамически обновляться, если вы добавите или удалите что-нибудь из него), вы можете поместить константу COUNT в конец его (TYPE_COUNT в вашем примере). Чтобы иметь возможность отличать недопустимые значения в перечислении, вы можете захотеть объявить другую константу. В вашем примере эта константа будет равна константе count, которая на одно значение больше наибольшего значения вашего перечисления.

Ответ 3

Зачем нужен type_count и зачем присваивать type_count type_unknown?

Чтобы сохранить вкладку с максимально допустимым значением для enum. Помните, что в противном случае не было бы способа проверить правильность заданного значения (в пределах диапазона) или нет.

Ответ 4

TYPE_COUNT может служить для измерения массива, проиндексированного элементами перечисления:

type_info my_info[TYPE_COUNT]; 

или может использоваться в условии выхода цикла for. TYPE_UNKNOWN может использоваться для представления недопустимого или undefined значения для типа (-1 может быть альтернативой TYPE_COUNT для его значения).