In C, auch der folgende Code gibt einen Fehler (wegen orange
):Können enums durch c in C ersetzt werden?
enum color {yellow, blue, green, red, brown, black, white, purple, orange};
enum fruit {cherry, apple, pear, melon, banana, strawberry, raspberry, orange};
Aber Code wie folgt:
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;
}
Kompiliert mit gcc --std=c89 -pedantic
.
Es scheint enum
s kann leicht durch const
Variablen ersetzt:
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;
}
Die nur Weg enum
anders verhält isthat können Sie absolut nicht den Wert von cherry, apple, ...
ändern, während bei der Verwendung von const
s man könnte versuchen, die üblichen Tricks wie int *y = &apple; *y = -7;
(mit gcc
Ich bekomme eine Warnung, aber es kompiliert).
Ist das der einzige Unterschied oder habe ich etwas verpasst?
'const Obst Apfel = 1; int * y = &apple; * y = -7; '. Undefiniertes Verhalten erhalten Sie, wenn Sie eine 'const'-Variable modifizieren. ** Edit **: Scheinbar wird es eher eine "Constraint-Verletzung" genannt, und eine C-Implementierung ist erforderlich, um davor zu warnen. – 3442
Worum geht es, wenn Sie es "const" deklarieren, wenn Sie es ändern wollen? – axiac
Eine bessere Frage wäre, warum 'const' benötigt wird, wenn man' enum' Konstanten verwenden kann (die garantiert so effizienten Maschinencode wie Literalzahlen liefern, während bei 'const' Werten dies von Optimierungen abhängt). – hyde