В C, даже следующий код выдает ошибку (из-за orange
):Могут ли перечисления быть заменены на consts в C?
enum color {yellow, blue, green, red, brown, black, white, purple, orange};
enum fruit {cherry, apple, pear, melon, banana, strawberry, raspberry, orange};
Но такой код:
enum fruit {cherry = 1, apple = 2, pear = 3, melon = 4, banana = 5, strawberry = 6, raspberry = 7, orange = 8};
int main(int argc, char *argv[]){
enum fruit f;
int x;
x = apple;
f = -7;
return 0;
}
компилирует с gcc --std=c89 -pedantic
.
кажется enum
s может быть легко заменен const
переменными:
typedef int fruit;
const fruit cherry = 1, apple = 2, pear = 3, melon = 4, banana = 5, strawberry = 6, raspberry = 7, orange = 8;
int main(int argc, char *argv[]){
fruit f;
int x;
x = apple;
f = -7;
return 0;
}
только образом enum
ведет себя по-разному isthat вы абсолютно не может изменить значение cherry, apple, ...
, в то время как с помощью const
сек можно попробовать обычные трюки, такие как int *y = &apple; *y = -7;
(с gcc
Я получаю предупреждение, но оно компилируется).
Разве это единственное различие или я что-то пропустил?
'сопзЬ фруктовым яблоко = 1; int * y = &apple; * y = -7; '. Неопределенное поведение - это то, что вы получаете для изменения переменной 'const'. ** Редактировать **: По-видимому, это скорее называется «нарушение ограничения», и для реализации этого требуется реализация C. – 3442
Какой смысл объявлять его 'const', если вы собираетесь его изменить? – axiac
Лучший вопрос: зачем нужен 'const', когда вы можете просто использовать константы enum ?, которые гарантированно создадут эффективный машинный код как буквенные числа, а значения' const' зависят от оптимизации. – hyde