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
:
enum
identifier
volit {
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-expression
dané . 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
azero
, 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é today
př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;