typedef enum, присваивая значение в пределах - PullRequest
11 голосов
/ 29 марта 2009

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

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

typedef enum {
    TYPE_DATE,
    TYPE_TIME,
    TYPE_MONEY,

    TYPE_COUNT,
    TYPE_UNKNOWN = TYPE_COUNT
} string_type_e;

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

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

Ответы [ 4 ]

17 голосов
/ 29 марта 2009

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

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

6 голосов
/ 29 марта 2009

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

3 голосов
/ 29 марта 2009

Почему type_count и почему type_count присваивается type_unknown?

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

2 голосов
/ 29 марта 2009

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

type_info my_info[TYPE_COUNT]; 

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...