我不认为我从根本上理解enum
是什么,以及何时使用它.
例如:
typedef enum {
kCircle,
kRectangle,
kOblateSpheroid
} ShapeType;
这里真正宣布的是什么?
我不认为我从根本上理解enum
是什么,以及何时使用它.
例如:
typedef enum {
kCircle,
kRectangle,
kOblateSpheroid
} ShapeType;
这里真正宣布的是什么?
这里声明了三件事:一个匿名枚举类型被声明,ShapeType
被声明为该匿名枚举的typedef,三个名称kCircle
、kRectangle
和kOblateSpheroid
被声明为整型常量.
我们来分析一下.在最简单的情况下,枚举可以声明为
enum tagname { ... };
这将声明一个标记为tagname
的枚举.在C和ObjuleC(但not C++)中,对这must的任何引用都是在enum
关键字之前.例如:
enum tagname x; // declare x of type 'enum tagname'
tagname x; // ERROR in C/Objective-C, OK in C++
为了避免到处使用enum
关键字,可以创建一个typedef:
enum tagname { ... };
typedef enum tagname tagname; // declare 'tagname' as a typedef for 'enum tagname'
这可以简化为一行:
typedef enum tagname { ... } tagname; // declare both 'enum tagname' and 'tagname'
最后,如果我们不需要将enum tagname
与enum
关键字一起使用,我们可以使enum
匿名,并且只使用typedef名称声明它:
typedef enum { ... } tagname;
现在,在本例中,我们将ShapeType
声明为匿名枚举的类型定义名称.ShapeType
实际上只是一个整数类型,应该只用于声明包含声明中列出的一个值(即kCircle
、kRectangle
和kOblateSpheroid
中的一个)的变量.不过,可以通过强制转换为ShapeType
变量指定另一个值,因此在读取枚举值时必须小心.
最后,kCircle
、kRectangle
和kOblateSpheroid
被声明为全局名称空间中的整型常量.由于没有指定特定的值,它们被分配给从0开始的连续整数,因此kCircle
是0,kRectangle
是1,kOblateSpheroid
是2.