Sdílet prostřednictvím


Deklarace výčtů v jazyce C

Výčet se skládá ze sady pojmenovaných celočíselné konstanty. Deklarace typu výčtu poskytuje název (volitelné) značky výčtu. A definuje sadu pojmenovaných celočísných identifikátorů (nazývá se sada výčtů, konstanty výčtu, výčtové konstanty, enumerátory nebo členy). Proměnná typu výčtu ukládá jednu z hodnot sady výčtů definovaných tímto typem.

enum Proměnné typu lze použít v indexovacích výrazech a jako operandy všech aritmetických a relačních operátorů. Výčty poskytují alternativu #define k direktivě preprocesoru s výhodami, které lze vygenerovat pro vás a dodržovat normální pravidla rozsahu.

Ve funkci ANSI C mají výrazy definující hodnotu konstanty enumerátoru vždy typ int . To znamená, že úložiště přidružené k proměnné výčtu je úložiště požadované pro jednu int hodnotu. Konstantu výčtu nebo hodnotu výčtového typu lze použít kdekoli, kde jazyk C povoluje celočíselný výraz.

Syntaxe

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

enumerator-list:
enumerator
enumerator-list , enumerator

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

enumeration-constant:
identifier

Volitelné identifier názvy typu výčtu definovaného .enumerator-list Tento identifikátor se často označuje jako značka výčtu určeného seznamem. Specifikátor typu deklaruje identifier , že je značkou výčtu určeného enumerator-list neterminalem, jak je vidět zde:

enum identifier
{
    // enumerator-list
}

Definuje enumerator-list členy sady výčtů.

Pokud je deklarace značky viditelná, pozdější deklarace, které používají značku, ale vynechat enumerator-list dříve deklarovaný výčtový typ. Značka musí odkazovat na definovaný typ výčtu a tento typ výčtu musí být v aktuálním oboru. Vzhledem k tomu, že typ výčtu je definován jinde, enumerator-list nezobrazí se v této deklaraci. Deklarace typů odvozených z výčtů a typedef deklarací pro typy výčtu mohou použít značku výčtu před definováním typu výčtu.

Každý enumeration-constant v názvech enumerator-list má hodnotu sady výčtů. Ve výchozím nastavení je první enumeration-constant přidružená k hodnotě 0. Další enumeration-constant v seznamu je přidružena k hodnotě ( constant-expression + 1 ), pokud ji explicitně přidružíte k jiné hodnotě. Název je enumeration-constant ekvivalentní jeho hodnotě.

Můžete použít enumeration-constant = constant-expression k přepsání výchozí sekvence hodnot. To znamená, že pokud enumeration-constant = constant-expression se zobrazí v enumerator-list, enumeration-constant je přidružen k hodnotě constant-expressiondané . Musí constant-expression mít int typ a může být záporný.

Následující pravidla platí pro členy sady výčtů:

  • Sada výčtů může obsahovat duplicitní konstantní hodnoty. Můžete například přidružit hodnotu 0 ke dvěma různým identifikátorům, například členům pojmenovaným null a zero, ve stejné sadě.

  • Identifikátory v seznamu výčtů musí být odlišné od jiných identifikátorů ve stejném oboru se stejnou viditelností. To zahrnuje běžné názvy proměnných a identifikátory v jiných seznamech výčtů.

  • Značky výčtu dodržují normální pravidla oborů. Musí se lišit od jiných značek výčtu, struktury a sjednocení se stejnou viditelností.

Příklady

Tyto příklady ilustrují deklarace výčtu:

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;

Hodnota 0 je ve výchozím nastavení přidružená saturday . Identifikátor sunday je explicitně nastaven na hodnotu 0. Zbývající identifikátory mají ve výchozím nastavení hodnoty 1 až 5.

V tomto příkladu je k proměnné todaypřiřazena hodnota ze sady DAY .

enum DAY today = wednesday;

Název konstanty výčtu se používá k přiřazení hodnoty. Vzhledem k tomu, že typ výčtu DAY byl dříve deklarován, je nutná pouze značka DAY výčtu.

Pokud chcete explicitně přiřadit celočíselnou hodnotu proměnné výčtového datového typu, použijte přetypování typu:

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

Toto přetypování se doporučuje v jazyce C, ale není povinné.

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

Tuto deklaraci lze také zadat jako

enum BOOLEAN { false, true } end_flag, match_flag;

nebo jako

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

Příklad, který používá tyto proměnné, může vypadat takto:

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

Nenájmenované datové typy enumerátoru lze deklarovat také. Název datového typu je vynechán, ale proměnné lze deklarovat. Proměnná je proměnná response definovaného typu:

enum { yes, no } response;

Viz také

Výčty