1 枚举类型的声明
1.1 匿名的枚举类型
最简单枚举类型声明包含了一个常量名称列表以及一个或多个变量。
enum {RED,BLUE,GREEN} color;
通过这种方式创建的是一个匿名的枚举类型,它只能用于这个例子中声明的变量。
1.2 署名的枚举类型
创建一个署名的枚举类型有利于声明更多新变量,尤其是当这些变量被用作子程序参数或模块端口时。需要首先创建枚举类型,然后创建相应的变量。使用内建的name()函数,可以得到枚举变量值对应的字符串。
typedef enum {INIT,DECODE,IDLE} fsmstate_e; //声明一个自定义的枚举类型
fsmstate_e pstate,nstate; //声明自定义类型变量
2 定义枚举值
枚举值缺省为从0开始递增的整数。可以自己定义枚举值。下例中使用INIT代表缺省值0,DECODE代表2,IDLE代表3.
typedef enum {INIT,DECODE=2,IDLE} fsmtype_e;
注意:常量名称列表中的枚举常量名(如INIT)作用范围规则和变量是一样的。因此,若将INIT用于不同的状态机中,那么必须在不同的作用域里声明它们,例如模块、程序块、函数和类。
BUG点:
如果没有特别,枚举类型会被当成int类型存储(缺省类型为双状态int)。由于int类型的缺省值是0,所以在给枚举常量赋值时务必小心。在下例中,position会被初始化为0,这并不是一个合法的ordinal_e变量。这种情况是语言本身所规定的,而非工具上的缺陷。因此,把0指定给一个枚举常量可以避免这个错误。
// 指定枚举值:不正确
typedef enum {FIRST=1,SECOND,THRID} ordinal_e;
ordinal_e position;
// 指定枚举值:正确
typedef enum {BAD_O=0,FIRST=1,SECOND,THRID} ordinal_e;
ordinal_e position;