Sdílet prostřednictvím


Deklarace výčtů v jazyce C

Výčet obsahuje sadu pojmenovaných celočíselných konstant.Deklarace typu výčtu poskytuje název značky výčtu (volitelné) a definuje sadu pojmenovaných celočíselných identifikátorů (nazývaných "sada výčtu," "konstanty výčtu," "výčty" nebo "členové").Proměnná s typem výčtu ukládá jednu z hodnot sady výčtu podle tohoto typu.

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ě preprocesoru #define, což přináší výhody v podobě automatického generování hodnot a dodržování běžných pravidel oboru.

V ANSI C mají výrazy, které určují hodnotu konstanty výčtu vždy typ int, navíc úložiště přidružené k proměnné výčtu představuje místo na disku požadované pro jednu hodnotu int.Konstantu výčtu nebo hodnotu výčtového typu lze použít kdekoli, kde jazyk C umožňuje používat celočíselný výraz.

Syntax

  • specifikátor výčtu:
    specifikátor výčtu volitelný**{** seznam výčtů }

    identifikátor výčtu

Nepovinný identifikátor pojmenovává typ výčtu, který je definován pomocí seznamu výčtů.Identifikátor se často nazývá "značka" výčtu zadaná seznamem.Specifikátor typu formuláře

enum identifier { enumerator-list }

deklaruje identifikátor jako příznak výčtu určený nonterminálním seznamem výčtů.Seznam výčtů definuje "obsah výčtu." Seznam výčtů je podrobně popsán níže.

Je-li deklarace značky viditelná, ostatní deklarace, které tuto značku používají, ale vynechávají seznam výčtů, 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 je typ výčtu definován jinde, neobjeví se seznam výčtů v této deklaraci.Deklarace typů odvozených z výčtů a deklarace typedef typů výčtů mohou používat značku výčtu před definováním typu výčtu.

Syntax

  • seznam výčtů:
    výčet

    seznam výčtů**,** enumerator

  • enumerator:
    konstanty výčtu

    konstanta výčtu = výraz konstanty

  • konstanta výčtu:
    identifikátor

Každá konstanta výčtu v seznamu výčtů pojmenovává hodnotu sady výčtů.Ve výchozím nastavení je první konstanta výčtu přidružena k hodnotě 0.Další konstanta výčtu v seznamu je přidružena k hodnotě ( výrazu konstanty + 1 ), pokud není ovšem přidružena k jiné hodnotě.Název konstanty výčtu se shoduje s její hodnotou.

Pro přepsání výchozího pořadí hodnot lze použít konstantu výčtu = výraz konstanty.Pokud se tedy konstanta výčtu = výraz konstanty zobrazí v seznamu výčtů, dojde k přidružení konstanty výčtu k hodnotě zadané výrazem konstanty.Výraz konstanty musí mít typ int a může být záporný.

Následující pravidla se vztahují na členy sady výčtů:

  • Sada výčtů může obsahovat duplicitní hodnoty konstanty.Je například možné přiřadit hodnotu 0 k dvěma různým identifikátorům, například s názvem null a zero v jedné sadě.

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

  • Značky výčtu dodržují běžná pravidla oboru.Musí být odlišné od jiných výčtů, struktur a značek sjednocení se stejnou viditelností.

Příklady

Tyto příklady zobrazují 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;

Ve výchozím nastavení je hodnota 0 přidružena k saturday .Identifikátor sunday je explicitně nastaven na hodnotu 0.Ve výchozím nastavení je zbývajícím identifikátorům přiřazena hodnota 1 až 5.

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

enum DAY today = wednesday;

Všimněte si, že k hodnotě konstanty výčtu je přiřazen její název.Protože byl typ výčtu DAY deklarován dříve, je požadována pouze značka výčtu DAY.

Pro explicitní přiřazení celočíselné hodnoty k proměnné výčtového datového typu, je třeba použít typ cast:

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

Cast je doporučen v jazyce C, ale není podmínkou.

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

Deklarace může být zadána také 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 například takto:

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

Lze deklarovat také nepojmenované datové typy výčtu.Název typu dat je vynechán, ale proměnné lze deklarovat.Proměnná response je proměnná definovaného typu:

enum { yes, no } response;

Viz také

Referenční dokumentace

Deklarace výčtů v jazyce C++