Sdílet prostřednictvím


Deklarace výčtů v jazyce C

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

Proměnné typu enum lze použít ve výrazech indexování a jako operandy všech aritmetických a relačních operátorů. Výčty poskytují alternativu k direktivě #define preprocesoru s výhodami, že hodnoty mohou být generovány pro vás a dodržovat normální pravidla oborů.

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

Syntax

enum-specifier:
enumidentifierRozhodnout{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 nástrojem enumerator-list. Tento identifikátor se často nazývá "značka" výčtu určeného seznamem. Specifikátor typu deklaruje identifier , že je značka výčtu určeného enumerator-list neterminálem, jak je vidět tady:

enum identifier
{
    // enumerator-list
}

Definuje enumerator-list členy sady výčtu.

Pokud je deklarace značky viditelná, pozdější deklarace, které značku používají, ale vynechat enumerator-list , určují dříve deklarovaný typ výčtu. 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 objektu enumerator-list pojmenuje hodnotu sady výčtu. Ve výchozím nastavení je první enumeration-constant přidružený k hodnotě 0. Další enumeration-constant položka v seznamu je přidružená k hodnotě ( constant-expression + 1 ), pokud ji explicitně nepřidružíte k jiné hodnotě. Název objektu enumeration-constant je ekvivalentní jeho hodnotě.

Pomocí příkazu můžete enumeration-constant = constant-expression přepsat výchozí sekvenci hodnot. To znamená, že pokud enumeration-constant = constant-expression se zobrazí v enumerator-list, enumeration-constant je přidružena k hodnotě zadané hodnotou .constant-expression Musí constant-expression mít int typ a může být negativní.

Následující pravidla platí pro členy výčtové sady:

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

  • Identifikátory v seznamu výčtu 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ýčtu.

  • Výčtové značky se řídí normálními pravidly 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 k. 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 hodnota ze sady DAY přiřazena proměnné today.

enum DAY today = wednesday;

Název konstanty výčtu slouží 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;

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

enum { yes, no } response;

Viz také

Výčty