Deklaracje modułów wyliczających języka C
Wyliczenie składa się z zestawu nazwanych stałych całkowitych. Deklaracja typu wyliczenia nadaje nazwę tagu wyliczenia (opcjonalnie). Definiuje zestaw nazwanych identyfikatorów liczb całkowitych (nazywany zestawem wyliczenia, stałymi wyliczania, modułami wyliczania, modułami wyliczania lub elementami członkowskimi). Zmienna typu wyliczenia przechowuje jedną z wartości zestawu wyliczenia zdefiniowanego przez ten typ.
enum
Zmienne typu mogą być używane w wyrażeniach indeksowania i jako operandy wszystkich operatorów arytmetycznych i relacyjnych. Wyliczenia stanowią alternatywę dla #define
dyrektywy preprocesora z zaletami, które można wygenerować dla Ciebie i przestrzegać normalnych reguł określania zakresu.
W języku ANSI C wyrażenia definiujące wartość stałej wyliczania zawsze mają int
typ. Oznacza to, że magazyn skojarzony ze zmienną wyliczenia jest magazynem wymaganym dla pojedynczej int
wartości. Stała wyliczenia lub wartość typu wyliczanego może być używana w dowolnym miejscu, w jakim język C zezwala na wyrażenie całkowite.
Składnia
enum-specifier
:
enum
identifier
Zdecydować {
enumerator-list
}
enum
identifier
enumerator-list
:
enumerator
enumerator-list
,
enumerator
enumerator
:
enumeration-constant
enumeration-constant
=
constant-expression
enumeration-constant
:
identifier
Opcjonalne identifier
nazwy typu wyliczenia zdefiniowanego przez enumerator-list
. Ten identyfikator jest często nazywany "tagiem" wyliczenia określonego przez listę. Specyfikator typu deklaruje identifier
, że jest tagiem wyliczenia określonego enumerator-list
przez nieterminalne, jak pokazano tutaj:
enum identifier
{
// enumerator-list
}
Element enumerator-list
definiuje elementy członkowskie zestawu wyliczenia.
Jeśli deklaracja tagu jest widoczna, późniejsze deklaracje używające tagu, ale pomijają enumerator-list
wcześniej zadeklarowany typ. Tag musi odwoływać się do zdefiniowanego typu wyliczenia, a ten typ wyliczenia musi znajdować się w bieżącym zakresie. Ponieważ typ wyliczenia jest zdefiniowany gdzie indziej, element enumerator-list
nie jest wyświetlany w tej deklaracji. Deklaracje typów pochodzących z wyliczenia i typedef
deklaracji dla typów wyliczenia mogą używać tagu wyliczenia przed zdefiniowaną typem wyliczenia.
Każda enumeration-constant
z nich w nazwie enumerator-list
wartość zestawu wyliczenia. Domyślnie pierwszy enumeration-constant
jest skojarzony z wartością 0. Następna enumeration-constant
na liście jest skojarzona z wartością ( constant-expression
+ 1 ), chyba że jawnie skojarzysz ją z inną wartością. Nazwa elementu enumeration-constant
jest równoważna jego wartości.
Można użyć enumeration-constant
= constant-expression
polecenia , aby zastąpić domyślną sekwencję wartości. Oznacza to, że jeśli enumeration-constant
= constant-expression
pojawi się w elemecie enumerator-list
, enumeration-constant
element jest skojarzony z wartością podaną przez .constant-expression
Musi constant-expression
mieć int
typ i może być ujemny.
Następujące reguły dotyczą elementów członkowskich zestawu wyliczenia:
Zestaw wyliczenia może zawierać zduplikowane wartości stałe. Można na przykład skojarzyć wartość 0 z dwoma różnymi identyfikatorami, na przykład elementami członkowskimi o nazwach
null
izero
, 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ą. Obejmuje to zwykłe nazwy zmiennych i identyfikatory na innych listach wyliczenia.
Tagi wyliczenia są zgodne z normalnymi regułami określania zakresu. Muszą one być różne od innych tagów wyliczania, struktury i unii z taką samą widocznością.
Przykłady
Te przykłady ilustrują deklaracje wyliczenia:
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 wartość 0. Pozostałe identyfikatory są domyślnie podane wartości od 1 do 5.
W tym przykładzie wartość z zestawu DAY
jest przypisywana do zmiennej today
.
enum DAY today = wednesday;
Nazwa stałej wyliczenia służy do przypisywania wartości. DAY
Ponieważ typ wyliczenia został wcześniej zadeklarowany, wymagany jest tylko tag DAY
wyliczenia.
Aby jawnie przypisać wartość całkowitą do zmiennej typu wyliczonego typu danych, użyj rzutowania typu:
workday = ( enum DAY ) ( day_value - 1 );
Rzutowanie jest zalecane w języku 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 */
Tę deklarację można również określić 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 modułu wyliczającego można również zadeklarować. Nazwa typu danych jest pomijana, ale zmienne można zadeklarować. Zmienna response
jest zmienną typu zdefiniowanego:
enum { yes, no } response;