Концепция перечисления также иногда называется «перечислимым типом».То есть это тип, все возможные значения которого названы и перечислены как часть определения типа.
C фактически отклоняется от этого бита, поскольку если a
и b
значения в перечислении, тогда a|b
также является допустимым значением этого типа, независимо от того, указан он в списке и назван или нет.Но вам не нужно использовать этот факт, вы можете использовать перечисление как перечислимый тип.
Они подходят, когда вам нужна переменная, возможные значения которой представляют одно из фиксированного списка вещей.Они также иногда подходят, когда вы хотите определить связку связанных констант времени компиляции, тем более что в C (в отличие от C ++) const int
не является константой времени компиляции.
Я думаю, чтоих наиболее полезные свойства:
1) Вы можете кратко определить набор различных констант, где вас не волнует, какие значения, если они различны.typedef enum { red, green, blue } color;
лучше, чем:
#define red 0
#define green 1
#define blue 2
2) Программист, увидев параметр / возвращаемое значение / переменную типа color
, знает, какие значения допустимы и что они означают (или в любом случае знает, как)чтобы посмотреть это).Лучше, чем сделать его int
, но задокументировать «этот параметр должен быть одним из значений цвета, определенных в каком-либо заголовке или другом».
3) Ваш отладчик, увидев переменную типа color
, можетбыть в состоянии сделать обратный поиск, и дать red
в качестве значения.Лучше, чем искать это в источнике.
4) Компилятор, увидев switch
выражения типа color
, может предупредить вас, если нет default
и какой-либо изперечисленные значения отсутствуют в списке case
с.Это помогает избежать ошибок, когда вы делаете что-то другое для каждого значения перечисления.