Objective-C中的typedef枚举是什么?

我认为我根本不了解什么是enum,以及何时使用它

例如:

类型定义枚举{
kCircle,
克里坦格尔,
科布拉特斯普洛德
}形状;

这里真正宣布的是什么

这里声明了三件事:一个匿名枚举类型被声明,ShapeType被声明为该匿名枚举的typedef,三个名称kCirclekRectanglekOblateSpheroid被声明为整型常量

让我们把它分解一下。在最简单的情况下,枚举可以声明为

枚举标记名{…};

这声明了一个带有标记名的枚举。在C和Objective-C中(但不是C++),对该的任何引用必须前面加上enum关键字。例如:

枚举标记名x;//声明“枚举标记名”类型的x
标记名x;//C/Objy-C中的错误,C++中的OK

为了避免到处使用enum关键字,可以创建一个typedef:

枚举标记名{…};
typedef枚举标记名标记名;//将“标记名”声明为“枚举标记名”的typedef

这可以简化为一行:

typedef枚举标记名{…}标记名;//声明“枚举标记名”和“标记名”

最后,如果我们不需要将enum标记名enum关键字一起使用,我们可以使enum匿名,并且只使用typedef名称声明它:

typedef枚举{…}标记名;

现在,在本例中,我们将ShapeType声明为匿名枚举的类型定义名称ShapeType实际上只是一个整型,只应用于声明包含声明中列出的一个值的变量(即kCircleKretAnglekOblateSpheroid中的一个)。但是,您可以通过强制转换为ShapeType变量指定另一个值,因此在读取枚举值时必须小心

最后,kCirclekRectanglekoblateSpropherod被声明为全局命名空间中的整型常量。由于没有指定特定的值,它们被分配给从0开始的连续整数,因此kCircle为0,kRectangle为1,koblatesprocheld为2

发表评论