Hallo Besucher, der Thread wurde 2k mal aufgerufen und enthält 6 Antworten

letzter Beitrag von MOS am

C enum Frage

  • In C gibt es die Enumerationen.


    enum { ZERO,ONE,TWO,THREE };


    so weit so gut.


    jetzt gibt es noch die Möglichkeit einen tag zu verwenden.


    Das sieht dann so aus:


    enum number { ZERO,ONE,TWO,THREE };


    ich verstehe nicht wofür dieser tag number gut sein soll.


    ich meine es geht doch auch ohne.


    okay ich kann mir jetzt eine Variable vom typ enum number definieren.


    enum number var;


    aber was bringt mir eine variable vom typ enum number?


    ich meine das ist doch keine structure in der ich mit einer solchen Variablen auf die individuellen Mitglieder zugreifen kann.

  • Eine gemeine Falle: Der C-Standard fordert:


    1447Each enumerated type shall be compatible with char, a signed integer type, or an unsigned integer type.


    und als solcher (char oder int) kann er auch Werte beinhalten, die für das enum ungültig sind. Der Programmierer hat sicherzustellen, dass das nicht passiert. Der Compiler stellt das nirgends sicher - auch nicht durch Kontrollen zur Laufzeit.

  • Nochmal zur ursprünglichen Frage wozu das tag nützlich ist: es dient dazu, daß man im Gültigkeitsbereich der bereits definierten enum-Variable(n), weitere enum-Variable deklarieren kann, ohne daß man dazu die komplette Beschreibung wiederholen muß. Bei struct-tags und union-tags ist das genauso.


    Also kannst Du dann, wenn Du am Anfang in einer Funktion dir bereits die ersten enum-Variablen mit


    enum number { ZERO,ONE,TWO,THREE } wert_1, wert_2;


    definiert hast, später einfach schreiben:


    enum number wert_3;


    ohne die geschweifte Klammer+Inhalt noch mal zu wiederholen.


    ...


    enums sind zwar in C nicht 'mächtiger' als einfache int-Variable, sie können trotzdem sinnvoll sein einen Datentyp mit begrenztem Wertebereich zu definieren. Um mit K&R zu argumentieren, kann eine Debug-Hilfe durchaus auch die int-Werte wieder zurückübersetzen, wenn sie aus enums herkommen.


    Ansonsten gilt halt Selbstdisziplin: Als sinnvolle Operationen kommen bei enums eigentlich nur Zuweisungen und Vergleiche auf gleich/ungleich in Betracht. Arithmetik macht üblicherweise schon keinen Sinn mehr.


    Ich nutze enums um z.B. in meiner image-Bibliothek den Datentyp der Pixel einer Bitmap festzuhalten. Die IMAGE-struct enthält dann neben der Größenangabe (Spalten und Zeilen) einen Zeiger auf die Bitmap (in einer Union!) und mit dem enum type weiß die Bibliothek dann auch, auf welchen Zeiger zugegriffen werden soll:

    Und TYPE ist per typedef enum so definiert:


    typedef enum {NONE=0, BYTE_IMG=4, FLOAT_IMG=6, RGB_IMG=17} TYPE;



    ... ansonsten nutz' ich halt immer noch gerne den Klassiker typedef enum {false,true} boolean; :D