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
:
enum
identifier
opt{
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
undzero
, 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;