Sind die Standard-Enumerationswerte in C für alle Compiler gleich?

Lesezeit: 2 Minuten

Benutzeravatar von SSS
SS

Wenn Sie eine Aufzählung wie unten gezeigt deklarieren, setzen alle C-Compiler die Standardwerte als x=0, y=1und z=2 sowohl auf Linux- als auch auf Windows-Systemen?

typedef enum {
    x,
    y,
    z
} someName;

  • Ja, es wird von den Standards verlangt, und ich bin sicher, dass jemand in der Lage sein wird, sie zu zitieren.

    – Nemo

    22. Juni 2011 um 2:05 Uhr

Ja. Sofern Sie bei der Definition der Enumeration nichts anderes angeben, hat der erste Enumerator immer den Wert Null und der Wert jedes nachfolgenden Enumerators ist um eins größer als der vorherige Enumerator.

  • und dieses identische Verhalten wird sowohl von C als auch von C++ benötigt. In C++ ist es [dcl.enum]: “Wenn der erste Enumerator keinen Initialisierer hat, ist der Wert der entsprechenden Konstante Null. Eine Enumerator-Definition ohne Initialisierer gibt dem Enumerator den Wert, der durch Erhöhen des Wertes des vorherigen Enumerators um eins erhalten wird.”

    – Ben Voigt

    22. Juni 2011 um 2:06 Uhr


  • Ja, und auch andere Sprachen, die mit dem Buchstaben C beginnen, wie C#.

    – James McNellis

    22. Juni 2011 um 2:07 Uhr

Ciro Santilli Benutzeravatar von OurBigBook.com
Ciro Santilli OurBigBook.com

C99-Standard

Das N1265 C99-Entwurf sagt bei 6.7.2.2/3 “Enumeration specifiers”

Ein Enumerator mit = definiert seine Enumerationskonstante als Wert des konstanten Ausdrucks. Wenn der erste Enumerator keine hat =, ist der Wert seiner Aufzählungskonstante 0. Jeder nachfolgende Enumerator mit no = definiert seine Aufzählungskonstante als den Wert des konstanten Ausdrucks, der durch Addieren von 1 zum Wert der vorherigen Aufzählungskonstante erhalten wird. (Die Verwendung von Aufzählungszeichen mit = kann Aufzählungskonstanten mit Werten erzeugen, die andere Werte in derselben Aufzählung duplizieren.)

Für konforme Implementierungen gilt also immer:

Haupt c

#include <assert.h>
#include <limits.h>

enum E {
    E0,
    E1,
    E2 = 3,
    E3 = 3,
    E4,
    E5 = INT_MAX,
#if 0
    /* error: overflow in enumeration values */
    E6,
#endif
};

int main(void) {
    /* If unspecified, the first is 0. */
    assert(E0 == 0);
    assert(E1 == 1);
    /* Repeated number, no problem. */
    assert(E2 == 3);
    assert(E3 == 3);
    /* Continue from the last one. */
    assert(E4 == 4);
    assert(E5 == INT_MAX);
    return 0;
}

Kompilieren und ausführen:

gcc -std=c99 -Wall -Wextra -pedantic -o main.out main.c
./main.out

Getestet in Ubuntu 16.04, GCC 6.4.0.

Benutzeravatar von Vignesh Vicky
Vignesh Vicky

Wenn der erste Wert der Enum-Variablen nicht initialisiert wird, weist der C-Compiler automatisch den Wert 0 zu. Der Compiler erhöht den Wert der vorangehenden Enum-Variablen weiterhin um 1.

Z.B:

enum months{jan,feb,mar}

Erläuterung: Der Wert von jan ist 0, feb ist 1, mar ist 2.

enum months{jan=123,feb=999,mar}

Erläuterung: Der Wert von jan ist 123, feb ist 999, mar ist 1000.

enum months{jan='a',feb='s',mar}

Erläuterung: Der Wert von jan ist ‘a’, feb ist ‘s’, mar ist ‘t’.

  • mar sein 't' nicht garantiert wird, kann es Zeichensätze geben, bei denen die Buchstaben nicht in fortlaufender alphabetischer Reihenfolge sind

    – MM

    27. Mai 2019 um 5:25 Uhr

Ja, Aufzählungswert standardmäßig von 0 bis zum n-ten Element für jede Plattform.

1422310cookie-checkSind die Standard-Enumerationswerte in C für alle Compiler gleich?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy