Dichiarazioni di enumerazioni C

Un'enumerazione è un set di costanti di tipo Integer denominate. Una dichiarazione di tipo di enumerazione fornisce il nome del tag di enumerazione (facoltativo). Definisce inoltre il set di identificatori integer denominati (denominato set di enumerazioni, costanti enumeratori, enumeratori o membri). Una variabile del tipo di enumerazione archivia uno dei valori del set di enumerazione definito da tale tipo.

Le variabili di tipo enum possono essere utilizzate nelle espressioni di indicizzazione e come operandi di tutti gli operatori aritmetici e relazionali. Le enumerazioni forniscono un'alternativa alla direttiva per il preprocessore #define con il vantaggio che i valori possono essere generati automaticamente e sono conformi alle normali regole di ambito.

In ANSI C le espressioni che definiscono il valore di una costante enumeratore hanno int sempre tipo. Ciò significa che l'archiviazione associata a una variabile di enumerazione è l'archiviazione necessaria per un singolo int valore. Una costante di enumerazione o un valore di tipo enumerato può essere utilizzato ovunque il linguaggio C consenta un'espressione Integer.

Sintassi

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

enumerator-list:
enumerator
enumerator-list , enumerator

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

enumeration-constant:
identifier

Il tipo di enumerazione facoltativo identifier definito da enumerator-list. Questo identificatore è spesso definito il "tag" dell'enumerazione specificata dall'elenco. Un identificatore di tipo dichiara identifier di essere il tag dell'enumerazione specificata dal enumerator-list nonterminal, come illustrato di seguito:

enum identifier
{
    // enumerator-list
}

Definisce enumerator-list i membri del set di enumerazione.

Se la dichiarazione di un tag è visibile, le dichiarazioni successive che usano il tag ma omettono enumerator-list di specificare il tipo enumerato dichiarato in precedenza. Il tag deve fare riferimento a un tipo di enumerazione definito e tale tipo di enumerazione deve trovarsi nell'ambito corrente. Poiché il tipo di enumerazione è definito altrove, non enumerator-list viene visualizzato in questa dichiarazione. Le dichiarazioni dei tipi derivati da enumerazioni e da dichiarazioni typedef per i tipi di enumerazione possono utilizzare il tag di enumerazione prima che sia definito il tipo di enumerazione.

Ognuno enumeration-constant in un enumerator-list nome un valore del set di enumerazione. Per impostazione predefinita, il primo enumeration-constant è associato al valore 0. Il successivo enumeration-constant nell'elenco è associato al valore di ( constant-expression + 1 ), a meno che non lo si associa esplicitamente a un altro valore. Il nome di un oggetto enumeration-constant equivale al relativo valore.

È possibile usare enumeration-constant = constant-expression per eseguire l'override della sequenza predefinita di valori. Ovvero, se enumeration-constant = constant-expression viene visualizzato in , l'oggetto enumerator-listenumeration-constant è associato al valore specificato da .constant-expression Il constant-expression tipo deve essere int negativo e può essere negativo.

Le regole seguenti vengono applicate ai membri di un set di enumerazione:

  • Un set di enumerazione può contenere valori costanti duplicati. Ad esempio, è possibile associare il valore 0 a due identificatori diversi, ad esempio membri denominati null e zero, nello stesso set.

  • Gli identificatori nell'elenco di enumerazione devono essere distinti da altri identificatori nello stesso ambito con la stessa visibilità. Ciò include nomi di variabili normali e identificatori in altri elenchi di enumerazione.

  • I tag di enumerazione sono conformi alle normali regole di ambito. Devono essere differenti da altri tag di enumerazione, struttura e unione con la stessa visibilità.

Esempio

In questi esempi vengono illustrate le dichiarazioni di enumerazione:

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;

Il valore 0 è associato a saturday per impostazione predefinita. L'identificatore sunday è impostato in modo esplicito su 0. Agli identificatori restanti vengono forniti i valori da 1 a 5 per impostazione predefinita.

In questo esempio, un valore del set DAY viene assegnato alla variabile today.

enum DAY today = wednesday;

Il nome della costante di enumerazione viene usato per assegnare il valore. Poiché il tipo di enumerazione DAY era dichiarato in precedenza, è necessario solo il tag DAY di enumerazione.

Per assegnare in modo esplicito un Integer a una variabile di un tipo di dati enumerato, utilizzare un cast di tipo:

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

Questo cast è consigliato in C ma non è obbligatorio.

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 */

Questa dichiarazione può essere specificata come

enum BOOLEAN { false, true } end_flag, match_flag;

o come

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

Un esempio che utilizza queste variabili potrebbe essere simile al seguente:

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

I tipi di dati senza nome dell'enumeratore possono anche essere dichiarati. Il nome del tipo di dati viene omesso, ma le variabili possono essere dichiarate. La variabile response è una variabile del tipo definito:

enum { yes, no } response;

Vedi anche

Enumerazioni