Идентификаторы / константы enum
имеют тип int
, поэтому их значения допустимо присваивать переменным int
:
"Идентификаторы в списке перечислителя объявлены как константы, которые имеют тип int
и могут появляться везде, где это разрешено. "
C18, §6.7.7.2 / 3
Однако тип перечисления может варьируются в зависимости от реализации:
"Каждый перечислимый тип должен быть совместим с char
, целочисленным типом со знаком или целочисленным типом без знака. Выбор типа определяется реализацией, 131), но должен быть может представлять значения всех членов перечисления ".
C18, §6.7.7.2 / 4
Таким образом, использование типа enum
может предотвратить любые Проблемы с типом при работе с enum
, помимо того, что они более читабельны.
Другое дело, что легко можно присвоить константу другого типа enum
day
, если он имеет тип int
.
enum week {Mon, Tue, Wed, Thur, Fri, Sat, Sun};
enum month {Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dez};
int day = Mar;
Это компилируется без проблем.
Высокоуровневый компилятор может выдавать предупреждение об этом при использовании типа enum week
вместо day
и добавляет этим дополнительный уровень безопасности.
enum week {Mon, Tue, Wed, Thur, Fri, Sat, Sun};
enum month {Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec};
enum week day = Mar;
Например, Clang, 10.0 выдает без дополнительных флагов:
" предупреждение: неявное преобразование из типа перечисления 'enum month' в другой тип перечисления 'enum week' [-Wenum- преобразование]"
G CC, 10.1 требуется флаг -Wall
или -Wenum-conversion
, чтобы выдать такое же предупреждение.
Также в этом посте рассматривается аналогичная проблема, но я бы не стал go объявлять его дубликатом:
Кроме того, я нашел эту интересную статью: