Deklaracje modułów wyliczających języka C
Wyliczenie składa się z zestawu nazwanych stałych liczb całkowitych.Deklaracja typu wyliczeniowego nadaje nazwę tagu wyliczenia (opcjonalnie) i definiuje zestaw nazwanych identyfikatorów liczb całkowitych (o nazwie "zestaw wyliczenia", "stałe wyliczenia", "wyliczenia" lub "członkowie").Zmienna typu wyliczenia przechowuje jedną z wartości zestawu wyliczenia, określoną przez ten typ.
Zmiennych typu enum można używać w wyrażeniach indeksowania i jako operandy wszystkich operatorów arytmetycznych i relacyjnych.Wyliczenia dostarczają alternatywy dla dyrektywy preprocesora #define z tą zaletą, że wartości mogą być generowane i przestrzegają normalnych reguł zakresu.
W ANSI C wyrażenia definiujące stałą wartość wyliczenia zawsze mają typ int; tak więc pamięć skojarzona ze zmienną wyliczenia jest pamięcią wymaganą dla pojedynczej wartości int.Wyliczenie stałe lub wartość typu wyliczeniowego może być użyta w dowolnym miejscu, gdzie język C zezwala na wyrażenie liczby całkowitej.
Składnia
enum-specifier:
enum identifier opt**{** enumerator-list }enum identifier
Opcjonalny identifier nazywa typ wyliczeniowy zdefiniowany przez enumerator-list.Ten identyfikator jest często nazywany "tagiem" wyliczenia określonego przez listę.Specyfikator typu w formie
enum identifier { enumerator-list }
deklaruje identifier jako tag wyliczenia określonego przez symbol nieterminalny enumerator-list.enumerator-list definiuje "zawartość wyliczenia." enumerator-list opisano szczegółowo poniżej.
Jeśli deklaracja tagu jest widoczna, późniejsze deklaracje, które używają tagu, ale pomijają enumerator-list określają poprzednio zadeklarowany typ wyliczeniowy.Tag musi odwoływać się do zdefiniowanego typu wyliczenia, a typ wyliczenia musi być w bieżącym zakresie.Ponieważ typ wyliczeniowy jest zdefiniowany w innym miejscu, enumerator-list nie pojawia się w tej deklaracji.Deklaracje typów pochodnych wyliczeń i deklaracje typedef typów wyliczeniowych mogą używać tagu wyliczenia przed zdefiniowaniem typu wyliczeniowego.
Składnia
enumerator-list:
enumeratorenumerator-list**,** enumerator
enumerator:
enumeration-constantenumeration-constant = constant-expression
enumeration-constant:
identifier
Każda enumeration-constant w enumeration-list nazywa wartość zestawu wyliczenia.Domyślnie pierwsza enumeration-constant jest skojarzona z wartością 0.Następna enumeration-constant na liście jest skojarzona z wartością ( constant-expression + 1), chyba że jawnie skojarzono ją z inną wartością.Nazwa enumeration-constant jest równoważna z jej wartością.
Można użyć enumeration-constant = constant-expression, aby zastąpić domyślną kombinację wartości.W ten sposób, jeśli enumeration-constant = constant-expression pojawi się w enumerator-list, enumeration-constant jest skojarzona z wartością podaną przez constant-expression.constant-expression musi być typu int i może być liczbą ujemną.
Następujące zasady stosuje się do członków zestawu wyliczenia:
Zestaw wyliczenia może zawierać zduplikowane wartości stałych.Na przykład można skojarzyć wartość 0 z dwoma różnymi identyfikatorami, być może o nazwie null i zero, w tym samym zestawie.
Identyfikatory na liście wyliczenia muszą być różne od innych identyfikatorów w tym samym zakresie z tą samą widocznością, włączając zwykłe nazwy zmiennych i identyfikatory w innych listach wyliczeń.
Tagi wyliczeń przestrzegają normalnych reguł zakresu.Muszą być odmienne od innych wyliczeń, struktur i znaczników wspólnych z tą samą widocznością.
Przykłady
Poniższe przykłady ilustrują deklaracje wyliczeń:
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;
Wartość 0 jest domyślnie skojarzona z saturday.Identyfikator sunday jest jawnie ustawiony na 0.Pozostałe identyfikatory mają domyślnie nadawane wartości od 1 do 5.
W tym przykładzie wartość z zestawu DAY jest przypisana do zmiennej today.
enum DAY today = wednesday;
Należy zauważyć, że nazwa stałej wyliczeniowej jest używana do przypisywania wartości.Ponieważ typ wyliczeniowy DAY został zadeklarowany wcześniej, tylko tag wyliczenia DAY jest niezbędny.
Aby jawnie przypisać wartość liczby całkowitej do zmiennej typ danych wyliczenia, należy użyć rzutowania typu:
workday = ( enum DAY ) ( day_value - 1 );
To rzutowanie jest zalecane w C, ale nie jest wymagane.
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 */
Deklaracja ta może być również określona jako
enum BOOLEAN { false, true } end_flag, match_flag;\
lub jako
enum BOOLEAN { false, true } end_flag;
enum BOOLEAN match_flag;
Przykład, który używa tych zmiennych może wyglądać następująco:
if ( match_flag == false )
{
.
. /* statement */
.
}
end_flag = true;
Nienazwane typy danych wyliczenia również mogą być deklarowane.Nazwa typu danych jest pominięta, ale zmienne mogą być deklarowane.Zmienna response jest zmienną zdefiniowanego typu:
enum { yes, no } response;