Udostępnij za pośrednictwem


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:
enumidentifierZdecydować { 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 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ą. 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;

Zobacz też

Wyliczenia