web-dev-qa-db-fra.com

Les valeurs enum par défaut en C sont-elles les mêmes pour tous les compilateurs?

Lorsque vous déclarez une énumération comme indiqué ci-dessous, tous les compilateurs C définissent-ils les valeurs par défaut comme x=0, y=1, et z=2 sur les systèmes Linux et Windows?

typedef enum {
    x,
    y,
    z
} someName;
103
SSS

Oui. Sauf indication contraire dans la définition de l'énumération, l'énumérateur initial a toujours la valeur zéro et la valeur de chaque énumérateur suivant est supérieure de 1% à celle de l'énumérateur précédent.

106
James McNellis

C99 Standard

Le brouillon N1265 C99 dit au 6.7.2.2/3 "Spécificateurs d'énumération"

Un énumérateur avec = définit sa constante d'énumération en tant que valeur de l'expression constante. Si le premier énumérateur n'a pas =, La valeur de sa constante d'énumération est 0. Chaque énumérateur suivant avec no = définit sa constante d'énumération comme la valeur de l'expression constante obtenue en ajoutant 1 à la valeur de l'énumération précédente. constant. (L'utilisation d'énumérateurs avec = peut produire des constantes d'énumération avec des valeurs qui dupliquent d'autres valeurs de la même énumération.)

Donc, ce qui suit est toujours valable pour les implémentations conformes:

principal 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;
}

Compiler et exécuter:

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

Testé sous Ubuntu 16.04, GCC 6.4.0.

Si la première valeur de la variable enum n'est pas initialisée, le compilateur C attribue automatiquement la valeur 0. Le compilateur continue à augmenter la valeur de la variable enum précédente de 1.

Par exemple:

enum months{jan,feb,mar}

Explication: La valeur de jan sera 0, feb sera 1, mar sera 2.

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

Explication: La valeur de jan sera de 123, feb sera de 999, mars sera de 1000.

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

Explication: La valeur de jan sera "a", fév sera "s", mar sera "t".

4
Vignesh vicky