我认为我根本不了解 enum
是什么,以及何时使用它。
例如:
typedef enum {
kCircle,
kRectangle,
kOblateSpheroid
} ShapeType;
这里真正声明了什么?
最佳答案
这里声明了三件事:声明了一个匿名枚举类型,ShapeType
声明了该匿名枚举的 typedef,以及三个名称 kCircle
、kRectangle
和 kOblateSpheroid
被声明为整数常量。
让我们分解一下。在最简单的情况下,可以将枚举声明为
enum tagname { ... };
这声明了一个带有标签tagname
的枚举。在 C 和 Objective-C(但不是 C++)中,对这个 的任何引用都必须以 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.
https://stackoverflow.com/questions/707512/