Guia de rastreamento dinâmico Solaris

Enumerações

Definir nomes simbólicos para constantes em um programa facilita a legibilidade e simplifica o processo de manutenção do programa no futuro. Um método é definir uma enumeração que associa um conjunto de inteiros a um conjunto de identificadores chamados enumeradores, que o compilador reconhece e substitui pelo valor de inteiro correspondente. Uma enumeração é definida usando-se uma declaração como:

enum colors {
	RED,
	GREEN,
	BLUE
};

O primeiro enumerador na enumeração, RED, recebe o valor zero e cada identificador subseqüente recebe o próximo valor de inteiro. Você também pode especificar um valor de inteiro explícito para qualquer enumerador usando como sufixo um sinal de igual e uma constante de inteiro, como no exemplo a seguir:

enum colors {
	RED = 7,
	GREEN = 9,
	BLUE
};

O compilador atribui o valor 10 ao enumerador BLUE porque ele não tem valor especificado e o enumerador anterior está definido como 9. Quando a enumeração é definida, os enumeradores podem ser usados em qualquer lugar de um programa em D em que uma constante de inteiro possa ser usada. Além disso, a enumeração enum colors também é definida como um tipo que seja equivalente a um int. O compilador de D permitirá que uma variável do tipo enum seja usada em qualquer lugar em que um int possa ser usado, e permitirá que qualquer valor de inteiro seja atribuído a uma variável do tipo enum. Você também pode omitir o nome da enum na declaração se o nome do tipo não for necessário.

Os enumeradores são visíveis em todas as cláusulas e declarações subseqüentes no seu programa, sendo assim, você não pode definir o mesmo identificador de enumerador em mais de uma enumeração. Entretanto, você pode definir mais de um enumerador que tenha o mesmo valor na mesma enumeração ou em enumerações diferentes. Você também pode atribuir inteiros que não possuam um enumerador correspondente a uma variável do tipo da enumeração.

A sintaxe da enumeração de D é a mesma que a sintaxe correspondente em ANSI-C. D também fornece acesso a enumerações definidas no kernel do sistema operacional e seus módulos carregáveis, mas esses enumeradores não são globalmente visíveis no programa em D. Os enumeradores do kernel só ficam visíveis quando usados como argumento para um dos operadores de comparação binários, quando comparados a um objeto do tipo de enumeração correspondente. Por exemplo, a função uiomove(9F) possui um parâmetro do tipo enum uio_rw definido da seguinte maneira:

enum uio_rw { UIO_READ, UIO_WRITE };

Os enumeradores UIO_READ e UIO_WRITE normalmente não são visíveis no seu programa em D, mas você pode promover sua visibilidade global comparando um deles a um valor do tipo enum uio_rw, conforme mostrado na cláusula do seguinte exemplo:

fbt::uiomove:entry
/args[2] == UIO_WRITE/
{
	...
}

Este exemplo rastreia chamadas à função uiomove(9F) para solicitações de gravação, comparando args[2], uma variável do tipo enum uio_rw, ao enumerador UIO_WRITE. Como o argumento do lado esquerdo é um tipo de enumeração, o compilador de D pesquisa a enumeração ao tentar resolver o identificador do lado direito. Esse recurso protege seus programas em D contra conflitos de nome de identificador acidentais com a grande coleção de enumerações definidas no kernel do sistema operacional.