Простой вопрос: допустимо ли 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>
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
отсутствует в качестве значения перечисления, не является проблемой.
Члены перечисления дают удобные идентификаторы только для некоторых возможных значений.
enums
, должны помнить об этом несоответствии между их ментальной моделью и фактической семантикой языка.
Новые вопросы
c
C - это язык программирования общего назначения, используемый для системного программирования (ОС и встраиваемых), библиотек, игр и кроссплатформенности. Этот тег следует использовать с общими вопросами, касающимися языка C, как это определено в стандарте ISO 9899 (последняя версия 9899: 2018, если не указано иное, а также для запросов, специфичных для версии, с c89, c99, c11 и т. Д.). C отличается от C ++ и не должен сочетаться с тэгом C ++ без разумной причины.
enum
являются арифметическими типами, целочисленные константы являются арифметическими типами, так что все в порядке, если не вызывает переполнения.