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 для его значения).