Declaraciones de enumeración de C
Una enumeración consta de un conjunto de constantes enteras con nombre. Una declaración de tipos de enumeración proporciona el nombre de la etiqueta de enumeración (opcional). Además, define el conjunto de identificadores enteros con nombre (denominado conjunto de enumeración, constantes de enumerador, enumeradores o miembros). Una variable del tipo de enumeración almacena uno de los valores del conjunto de enumeración definido por ese tipo.
Las variables de tipo enum
se pueden usar en expresiones de indización y como operandos de todos los operadores relacionales y aritméticos. Las enumeraciones proporcionan una alternativa a la directiva de preprocesador #define
con las ventajas de que los valores se pueden generar automáticamente y pueden seguir reglas de ámbito normales.
En ANSI C, las expresiones que definen el valor de una constante de enumerador siempre tienen el tipo int
. Esto significa que el almacenamiento asociado a una variable de enumeración es el almacenamiento necesario para un único valor int
. Una constante de enumeración o un valor de tipo enumerado se pueden usar en cualquier lugar donde el lenguaje C permita una expresión de tipo entero.
Sintaxis
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
El elemento identifier
opcional denomina el tipo de enumeración definido por enumerator-list
. Este identificador se suele denominar la “etiqueta” de la enumeración especificada por la lista. Un identificador de tipo declara que identifier
es la etiqueta de la enumeración especificada por el elemento enumerator-list
no terminal, como se muestra a continuación:
enum identifier
{
// enumerator-list
}
El elemento enumerator-list
define los miembros del conjunto de enumeración.
Si la declaración de una etiqueta es visible, las declaraciones posteriores que utilizan la etiqueta pero omiten enumerator-list
especifican el tipo enumerado declarado previamente. La etiqueta debe hacer referencia a un tipo de enumeración definido y ese tipo de enumeración debe estar en el ámbito actual. Puesto que el tipo de enumeración se define en otro lugar, enumerator-list
no aparece en esta declaración. Las declaraciones de tipos derivados de enumeraciones y las declaraciones typedef
para tipos de enumeración pueden utilizar la etiqueta de la enumeración antes de definir el tipo de enumeración.
Cada enumeration-constant
en un elemento enumerator-list
denomina un valor del conjunto de enumeración. De forma predeterminada, la primera enumeration-constant
se asocia al valor 0. El siguiente elemento enumeration-constant
de la lista se asocia al valor de ( constant-expression
+ 1), a menos que se asocie explícitamente a otro valor. El nombre de una enumeration-constant
es equivalente a su valor.
Puede usar enumeration-constant
= constant-expression
para reemplazar la secuencia de valores predeterminada. Es decir, si aparece enumeration-constant
= constant-expression
en el elemento enumerator-list
, la enumeration-constant
está asociada con el valor proporcionado por constant-expression
. La constant-expression
debe tener un tipo int
y puede ser negativa.
Las reglas siguientes se aplican a los miembros de un conjunto de enumeración:
Un conjunto de enumeración puede contener valores constantes duplicados. Por ejemplo, puede asociar el valor 0 a dos identificadores diferentes, por ejemplo dos miembros denominados
null
yzero
, en el mismo conjunto.Los identificadores de la lista de enumeración deben ser distintos de otros identificadores del mismo ámbito con la misma visibilidad. Esto incluye nombres de variable normales e identificadores de otras listas de enumeración.
Las etiquetas de enumeración siguen las reglas habituales de ámbito. Deben ser distintas de otras etiquetas de enumeración, estructura y unión con la misma visibilidad.
Ejemplos
Estos ejemplos muestran declaraciones de enumeración:
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;
El valor 0 se asocia a saturday
de forma predeterminada. El identificador sunday
se establece explícitamente en 0. Los identificadores restantes reciben los valores 1 a 5 de forma predeterminada.
En este ejemplo, un valor del conjunto DAY
se asigna a la variable today
.
enum DAY today = wednesday;
El nombre de la constante de enumeración se utiliza para asignar el valor. Desde que el tipo de enumeración DAY
se declaró previamente, solo es necesaria la etiqueta de enumeración DAY
.
Para asignar explícitamente un valor entero a una variable de un tipo de datos enumerado, utilice una conversión de tipo:
workday = ( enum DAY ) ( day_value - 1 );
Esta conversión es recomendable en C, pero no es necesaria.
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 */
Esta declaración también se puede especificar como
enum BOOLEAN { false, true } end_flag, match_flag;
o como
enum BOOLEAN { false, true } end_flag;
enum BOOLEAN match_flag;
Un ejemplo que utilizara estas variables sería similar a:
if ( match_flag == false )
{
.
. /* statement */
.
}
end_flag = true;
Los tipos de datos de enumerador sin nombre también pueden declararse. El nombre del tipo de datos se omite, pero las variables se pueden declarar. La variable response
es una variable del tipo definido:
enum { yes, no } response;