Enumeration Types and typedef
enum Used to declare enumeration types. Allows to name a finite set and to declare identifiers, called enumerators.
Creates the user-defined type enum day. tag name constants of type int enum day {sun, mon, tue, wed, thu, fri, sat}; enum day d1, d2; … d1 = fri; if (d1 == d2) 1 6
Enumerators can be initialized. We can declare variables directly after the enumerator declaration. enum suit {clubs = 1, diamonds, hearts, spades} a, b, c; 2 3 4 enum fruit {apple = 7, pear, orange = 3, lemon} frt; 8 4
It is allowed, but the identifiers must be unique. enum veg {beet = 17, corn = 17} vege1, vege2; It is allowed, but the identifiers must be unique. enum {fir, pine} tree; The tag name need not be present. But no other variables of type enum {fir, pine} can be declared.
typedef An identifier can be associated with a specific type. typedef int color; color red, blue, green; The typedef facility allows the programmer to use type names that are appropriate for a specific application. Also, helps to control complexity when programmers are building complicated or lengthy user-defined types.
Example – Compute the next day enum day {sun, mon, tue, wed, thu, fri, sat}; typedef enum day day; day find_next_day(day d) { day next_day; switch (d) { case sun: next_day = mon; break; tag name type
case mon: next_day = tue; break; … case sat: next_day = sun; } return next_day;
Another Version cast enum day {sun, mon, tue, wed, thu, fri, sat}; typedef enum day day; day find_next_day(day d) { return((day) (((int) d + 1)%7)); } cast
Style Enumerators can be mnemonic. => Their use tends to be self-documenting. The use of enumeration types is considered good programming style. enum bool {false, true}; enum off_on {off, on}; enum no_yes {no, yes} enum speed {slow, fast} Put such declarations in header files. (good programming style)
Style All acceptable. Which one is used is a matter of personal taste. enum lo_hi {lo, hi}; typedef enum lo_hi lo_hi; All acceptable. Which one is used is a matter of personal taste. typedef enum lo_hi {lo, hi} lo_hi; typedef enum {lo, hi} lo_hi;