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ýčetseznam výčtů**,** enumerator
enumerator:
konstanty výčtukonstanta 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;