Déclarations d’énumération C
Une énumération se compose d'un ensemble de constantes entières nommées. Une déclaration de type d’énumération donne le nom de la balise d’énumération (facultative). Et elle définit l’ensemble d’identificateurs entiers nommés (appelé ensemble d’énumération, constantes d’énumérateur, énumérateurs ou membres). Une variable du type énumération stocke une des valeurs de l'ensemble d'énumération défini par ce type.
Les variables de type enum
peuvent être utilisées dans des expressions d'indexation et comme opérandes de tous les opérateurs arithmétiques et relationnels. Les énumérations offrent une alternative à la directive de préprocesseur #define
et présentent l'avantage suivant : les valeurs peuvent être générées pour vous et se conformer aux règles normales de portée.
En C ANSI, les expressions qui définissent la valeur d’une constante d’énumérateur ont toujours le type int
. Cela signifie que le stockage associé à une variable d’énumération est le stockage requis pour une valeur int
unique. Une constante d'énumération ou une valeur de type énuméré peut être utilisée partout où le langage C autorise une expression d'entier.
Syntaxe
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
Le identifier
facultatif nomme le type d’énumération défini par enumerator-list
. Cet identificateur est souvent appelé « étiquette » de l’énumération spécifiée par la liste. Un spécificateur de type déclare identifier
comme la balise de l’énumération spécifiée par l’enumerator-list
non terminal, comme indiqué ici :
enum identifier
{
// enumerator-list
}
enumerator-list
définit les membres de l’ensemble d’énumération.
Si la déclaration d’une étiquette est visible, les déclarations ultérieures qui utilisent l’étiquette mais omettent l’élément enumerator-list
spécifient le type énuméré déclaré précédemment. L’étiquette doit faire référence à un type énumération défini, et ce type énumération doit se trouver dans la portée actuelle. Étant donné que le type d’énumération est défini ailleurs, l’élément enumerator-list
n’apparaît pas dans cette déclaration. Les déclarations des types dérivés à partir des énumérations et les déclarations de typedef
pour les types énumération peuvent utiliser la balise d'énumération avant que le type énumération ne soit défini.
Chaque enumeration-constant
dans un enumerator-list
nomme une valeur de l’ensemble d’énumération. Par défaut, la première enumeration-constant
est associée à la valeur 0. La enumeration-constant
suivante dans la liste est associée à la valeur (constant-expression
+ 1), sauf si vous l’associez explicitement à une autre valeur. Le nom d’une enumeration-constant
est équivalent à sa valeur.
Vous pouvez utiliser enumeration-constant
= constant-expression
pour remplacer la séquence de valeurs par défaut. Autrement dit, s’il enumeration-constant
= constant-expression
apparaît dans la enumerator-list
, la enumeration-constant
est associée à la valeur donnée par constant-expression
. La constant-expression
doit avoir le type int
et ne peut pas être négative.
Les règles suivantes s'appliquent aux membres d'un ensemble d'énumération :
Un ensemble d'énumération peut contenir des valeurs de constante en double. Par exemple, vous pouvez associer la valeur 0 à deux identificateurs différents, par exemple, nommés
null
etzero
, dans le même ensemble.Les identificateurs dans la liste d'énumérations doivent être distincts des autres identificateurs dans la même portée ayant la même visibilité. Cela inclut les noms de variable et identificateurs ordinaires dans les autres listes d'énumération.
Les balises d'énumération obéissent aux règles normales de portée. Elles doivent être distinctes des autres balises d'énumération, de structure et d'union ayant la même visibilité.
Exemples
Les exemples suivants illustrent des déclarations d'énumération :
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;
La valeur 0 est associée à saturday
par défaut. L'identificateur sunday
est explicitement défini à 0. Les autres identificateurs sont définis avec les valeurs 1 à 5 par défaut.
Dans cet exemple, une valeur de l'ensemble DAY
est assignée à la variable today
.
enum DAY today = wednesday;
Le nom de la constante d'énumération est utilisé pour assigner la valeur. Étant donné que le type énumération DAY
a été déclaré précédemment, seule la balise d'énumération DAY
est nécessaire.
Pour assigner explicitement une valeur d'entier à une variable d'un type de données énuméré, utilisez un cast de type :
workday = ( enum DAY ) ( day_value - 1 );
Ce cast est recommandé en C mais n'est pas requis.
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 */
Cette déclaration peut également être spécifiée sous la forme
enum BOOLEAN { false, true } end_flag, match_flag;
ou sous la forme
enum BOOLEAN { false, true } end_flag;
enum BOOLEAN match_flag;
Voici un exemple qui utilise ces variables :
if ( match_flag == false )
{
.
. /* statement */
.
}
end_flag = true;
Les types de données d'énumérateur sans nom peuvent également être déclarés. Le nom du type de données est omis, mais les variables peuvent être déclarées. La variable response
est une variable du type défini :
enum { yes, no } response;