Простой вопрос: допустимо ли enum { a } e = 1;?

Другими словами: является ли корректным поведением присвоение значения, которого нет в наборе значений констант перечисления?

Демо:

$ gcc t0.c -std=c11 -pedantic -Wall -Wextra -c
<nothing>

$ clang t0.c -std=c11 -pedantic -Wall -Wextra -c
<nothing>

$ icc t0.c -std=c11 -pedantic -Wall -Wextra
t0.c(1): warning #188: enumerated type mixed with another type
# note: the same warning for enum { a } e = 0;

$ cl t0.c /std:c11 /Za /c
<nothing>
11
pmor 4 Фев 2022 в 18:14
C11 6.5.16.1 гласит: "арифметический тип = арифметический type" в порядке... enum являются арифметическими типами, целочисленные константы являются арифметическими типами, так что все в порядке, если не вызывает переполнения.
 – 
pmg
4 Фев 2022 в 18:29
6.7.2.2p4 – Каждый пронумерованный тип должен быть совместим с char, целочисленным типом со знаком или целочисленным типом без знака.
 – 
Eugene Sh.
4 Фев 2022 в 18:30
Даже если это разрешено, это может привести к жесткому обслуживанию кода.
 – 
Ptit Xav
4 Фев 2022 в 18:34

1 ответ

Из стандарта C18 в 6.7.2.2:

Each enumerated type shall be compatible with char , a signed integer type, or an unsigned integer type. The choice of type is implementation-defined, but shall be capable of representing the values of all the members of the enumeration.

Итак, да, enum { a } e = 1; действителен. e — это целочисленный тип, поэтому он может принимать значение 1. Тот факт, что 1 отсутствует в качестве значения перечисления, не является проблемой. Члены перечисления дают удобные идентификаторы только для некоторых возможных значений.

7
koder 4 Фев 2022 в 18:32
1
«Элементы перечисления дают удобные идентификаторы только для некоторых возможных значений» — согласно семантике языка, да, но обычно это не является предполагаемой моделью использования программиста. Программисты, использующие enums, должны помнить об этом несоответствии между их ментальной моделью и фактической семантикой языка.
 – 
John Bollinger
4 Фев 2022 в 18:44
Даже если это «разрешено», это плохой стиль, и его следует избегать.
 – 
koder
4 Фев 2022 в 18:53