Partilhar via


Declarações de enumeração C

Uma enumeração consiste em um conjunto de constantes de número inteiro nomeadas. Uma declaração de tipo de enumeração fornece o nome da marca de enumeração (opcional). Define também o conjunto de identificadores de inteiros nomeados (chamado de conjunto de enumeração, constantes de enumerador, enumeradores ou membros). Uma variável do tipo enumeração armazena um dos valores do conjunto de enumerações definido por esse tipo.

Variáveis do tipo enum podem ser usadas em expressões de indexação e como operandos de todos os operadores aritméticos e relacionais. As enumerações fornecem uma alternativa à política de pré-processador de #define com a vantagem de que os valores podem ser gerados para você e obedecer regras normais de escopo.

Em ANSI C, as expressões que definem o valor de uma constante de enumerador sempre têm o tipo int. Assim, o armazenamento associado a uma variável de enumeração é o armazenamento exigido para um único valor de int. Uma constante de enumeração ou um valor do tipo enumerado podem ser usados em qualquer lugar em que a linguagem C permita uma expressão de inteiro.

Sintaxe

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

enumerator-list:
enumerator
enumerator-list , enumerator

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

enumeration-constant:
identifier

O identifier opcional nomeia o tipo de enumeração definido por enumerator-list. Esse identificador é geralmente chamado de a "marca" de enumeração especificada pela lista. Um especificador de tipo declara identifier para ser a marca da enumeração especificada pelo enumerator-list não-terminal, conforme visto aqui:

enum identifier
{
    // enumerator-list
}

O enumerator-list define os membros do conjunto de enumeração.

Se a declaração de uma marca estiver visível, as declarações posteriores que usarem a marca, mas omitirem enumerator-list, especificarão o tipo enumerado declarado anteriormente. A marca deve se referir a um tipo definido da enumeração, e esse tipo de enumeração deve estar no escopo atual. Como o tipo de enumeração é definido em outro lugar, a enumerator-list não aparece nesta declaração. As declarações de tipos derivados das enumerações e as declarações typedef para tipos de enumeração podem usar a marca de enumeração antes que o tipo de enumeração seja definido.

Cada enumeration-constant em uma enumerator-list nomeia um valor do conjunto de enumeração. Por padrão, a primeira enumeration-constant é associada ao valor 0. A próxima enumeration-constant na lista é associada ao valor de (constant-expression + 1), a menos que você a associe explicitamente a outro valor. O nome de uma enumeration-constant é equivalente ao seu valor.

É possível usar enumeration-constant = constant-expression para substituir a sequência padrão de valores. Ou seja, se enumeration-constant = constant-expression aparecer no enumerator-list, o enumeration-constant será associado ao valor fornecido por constant-expression. A constant-expression deve ser do tipo int e pode ser negativa.

As regras a seguir se aplicam aos membros de um conjunto de enumerações:

  • Um conjunto de enumerações pode conter valores duplicados de constantes. Por exemplo, você pode associar o valor 0 a dois identificadores diferentes, por exemplo, membros nomeados como null e zero, no mesmo conjunto.

  • Os identificadores da lista de enumerações devem ser distintos de outros identificadores no mesmo escopo e com a mesma visibilidade. Isso inclui nomes de variáveis comuns e identificadores em outras listas de enumeração.

  • As marcas de enumeração obedecem as regras normais de escopo. Elas devem ser distintas de outras marcas de enumerações, estruturas, e união com a mesma visibilidade.

Exemplos

Esses exemplos ilustram declarações de enumeração:

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;

O valor 0 é associado a saturday por padrão. O identificador sunday é explicitamente definido como 0. Os identificadores restantes recebem valores de 1 a 5 por padrão.

Neste exemplo, um valor do conjunto DAY é atribuído à variável today.

enum DAY today = wednesday;

O nome da constante de enumeração é usado para atribuir o valor. Como o tipo de enumeração DAY foi declarado anteriormente, somente a marca de enumeração DAY é necessária.

Para atribuir explicitamente um valor inteiro a uma variável de tipo de dados enumerado, use uma conversão de tipo:

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

Essa conversão é recomendada em C, mas não é necessária.

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

Essa declaração também pode ser especificada como

enum BOOLEAN { false, true } end_flag, match_flag;

ou como

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

Um exemplo que usa essas variáveis pode ter esta aparência:

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

Os tipos de dados de enumerador sem nome também podem ser declarados. O nome do tipo de dados é omitido, mas as variáveis podem ser declaradas. A variável response é uma variável de tipo definida:

enum { yes, no } response;

Confira também

Enumerações