C-Enumerationsdeklarationen

Eine Enumeration besteht aus einem Satz von benannten ganzzahligen Konstanten. Eine Enumerationstypdeklaration gibt den Namen des (optionalen) Enumerationstags an. Darüber hinaus definiert sie die angegebenen ganzzahligen Bezeichner (Enumerationssatz, Enumeratorkonstanten, Enumeratoren oder Member genannt). Eine Variable vom Typ Enumeration speichert einen der Werte des Enumerationssatzes, der durch diesen Typ definiert wird.

Variablen des Typs enum können in Indizierungsausdrücken und als Operanden aller arithmetischen und relationalen Operatoren verwendet werden. Enumerationen bieten eine Alternative zur Präprozessordirektive #define und bieten den Vorteil, dass die Werte für Sie generiert werden und normalen Bereichsregeln folgen.

In ANSI C sind die Ausdrücke, die den Wert einer Enumeratorkonstante definieren, immer vom Typ int . Dies bedeutet, dass der Speicher, der einer Enumerationsvariablen zugeordnet ist, dem Speicher entspricht, der für einen einzelnen int -Wert erforderlich ist. Eine Enumerationskonstante oder ein Wert des enumerierten Typs kann überall dort verwendet werden, wo die Programmiersprache C einen ganzzahligen Ausdruck gestattet.

Syntax

enum-specifier:
enumidentifieropt{enumerator-list}
enum identifier

enumerator-list:
enumerator
enumerator-list , enumerator

enumerator:
enumeration-constant
enumeration-constant = constant-expression

enumeration-constant:
identifier

Der optionale Bezeichner ( identifier ) gibt den durch enumerator-list definierten Enumerationstyp an. Dieser Bezeichner wird oft als „Tag“ der Enumeration bezeichnet, die von der Liste angegeben wird. Ein Typspezifizierer deklariert identifier als Tag der Enumeration, die vom enumerator-list -Nichtterminal spezifiziert wird, wie hier zu sehen:

enum identifier
{
    // enumerator-list
}

enumerator-list definiert die Member des Enumerationssatzes.

Wenn die Deklaration eines Tags sichtbar ist, geben nachfolgende Deklarationen, die das Tag verwenden, enumerator-list jedoch weglassen, den zuvor deklarierten Aufzählungstyp an. Das Tag muss auf einen definierten Enumerationstyp verweisen, der sich im aktuellen Bereich befindet. Da der Enumerationstyp an anderer Stelle definiert ist, wird enumerator-list in dieser Deklaration nicht verwendet. Deklarationen von Typen, die aus Enumerationen abgeleitet sind, und typedef-Deklarationen für Enumerationstypen können das Enumerationstag vor der Definition des Enumerationstyps verwenden.

enumeration-constant in enumerator-list gibt immer einen Wert des Enumerationssatzes an. Standardmäßig wird der ersten enumeration-constant der Wert 0 (null) zugeordnet. Dem nächsten enumeration-constant -Listeneintrag wird der Wert ( constant-expression + 1) zugeordnet, außer Sie ordnen ihm explizit einem anderen Wert zu. Der Name einer enumeration-constant entspricht ihrem Wert.

Sie können enumeration-constant = constant-expression verwenden, um die Standardwertesequenz außer Kraft zu setzen. Das heißt, wenn enumeration-constant = constant-expression in enumerator-list verwendet wird, wird enumeration-constant der in constant-expression festgelegte Wert zugeordnet. constant-expression muss vom Typ int sein und kann negativ sein.

Die folgenden Regeln gelten für Member eines Enumerationssatzes:

  • Ein Enumerationssatz kann doppelte konstante Werte enthalten. Beispielsweise könnten Sie den Wert 0 (null) zwei verschiedenen Bezeichnern, z. B. Membern mit den Namen null und zero, im selben Satz zuweisen.

  • Die Bezeichner in der Enumerationsliste müssen sich von anderen Bezeichnern im selben Bereich mit der gleichen Sichtbarkeit unterscheiden. Dies schließt gewöhnliche Variablennamen und Bezeichner in anderen Enumerationslisten ein.

  • Enumerationstags folgen normalen Bereichsregeln. Sie müssen sich von anderen Enumerations-, Struktur- und Union-Tags mit derselben Sichtbarkeit unterscheiden.

Beispiele

Diese Beispiele veranschaulichen Enumerationsdeklarationen:

enum DAY            /* Defines an enumeration type    */
{
    saturday,       /* Names day and declares a       */
    sunday = 0,     /* variable named workday with    */
    monday,         /* that type                      */
    tuesday,
    wednesday,      /* wednesday is associated with 3 */
    thursday,
    friday
} workday;

Der Wert 0 wird standardmäßig saturday zugeordnet. Der Bezeichner sunday wird explizit auf 0 festgelegt. Den verbleibenden Bezeichnern werden standardmäßig die Werte 1 bis 5 zugewiesen.

In diesem Beispiel wird ein Wert aus dem DAY-Satz der Variable today zugewiesen.

enum DAY today = wednesday;

Der Name der Enumerationskonstante wird zum Zuweisen des Werts verwendet. Da zuvor der Enumerationstyp DAY deklariert wurde, ist nur das Enumerationstag DAY erforderlich.

Um einen ganzzahligen Wert explizit der Variable des enumerierten Datentyps zuzuweisen, verwenden Sie eine Typumwandlung:

workday = ( enum DAY ) ( day_value - 1 );

Diese Umwandlung wird in C empfohlen, ist aber nicht erforderlich.

enum BOOLEAN  /* Declares an enumeration data type called BOOLEAN */
{
    false,     /* false = 0, true = 1 */
    true
};

enum BOOLEAN end_flag, match_flag; /* Two variables of type BOOLEAN */

Diese Deklaration kann auch so angegeben werden:

enum BOOLEAN { false, true } end_flag, match_flag;

Oder so:

enum BOOLEAN { false, true } end_flag;
enum BOOLEAN match_flag;

Ein Beispiel mit diesen Variablen könnte folgendermaßen aussehen:

if ( match_flag == false )
    {
     .
     .   /* statement */
     .
    }
    end_flag = true;

Auch unbenannte Enumeratordatentypen können deklariert werden. Der Name des Datentyps wird weggelassen, aber Variablen lassen sich deklarieren. Die Variable response ist eine Variable des definierten Typs:

enum { yes, no } response;

Siehe auch

Enumerationen