简短版
当这样声明枚举时,枚举常量的数据类型如何保证为NSUInteger而不是unsigned int:
enum {
NSNullCellType = 0,
NSTextCellType = 1,
NSImageCellType = 2
};
typedef NSUInteger NSCellType;
typedef到NSUInteger似乎与枚举声明没有任何关联。
完整版本
我正在阅读苹果公司的64位Cocoa转换指南,以获取有关枚举值的指导,并产生了一个问题。这是枚举常量部分的一段(冗长的)引用,重点在于我:
枚举(enum)常量的问题在于它们的数据类型经常是不确定的。换句话说,枚举常量不能可预测地为unsigned int。对于传统构造的枚举,编译器实际上根据其所发现的内容设置底层类型。底层类型可以是(有符号的)int或甚至是long。看下面的例子:
type enum {
MyFlagError = -1,
MyFlagLow = 0,
MyFlagMiddle = 1,
MyFlagHigh = 2
} MyFlagType;
编译器看到这个声明,并且发现一个成员常量被赋了一个负值,它会声明枚举的基础类型为int。如果成员的值的范围不适合int或unsigned int,则基础类型会静默地变为64位(long)。因此,作为枚举定义的量的基础类型可以根据枚举中的值而静默地改变大小。无论您是在编译32位还是64位,都可能发生这种情况。不用说,这种情况对二进制兼容性构成了障碍。 为解决这个问题,苹果公司决定在Cocoa API中更明确地指定枚举类型。现在,头文件单独声明了一个可指定大小的枚举类型,而不是以枚举形式声明参数。枚举的成员及其值如之前所述进行声明和赋值。例如,不再使用以下方式:
typedef enum {
NSNullCellType = 0,
NSTextCellType = 1,
NSImageCellType = 2
} NSCellType;
现在有这个:
enum {
NSNullCellType = 0,
NSTextCellType = 1,
NSImageCellType = 2
};
typedef NSUInteger NSCellType;
枚举类型是以 NSInteger 或 NSUInteger 定义的,以便在 64 位体系结构上使基本枚举类型具备 64 位能力。
我的问题是:鉴于 typedef 看起来并没有明确地与枚举声明相关联,那么如何知道它们的数据类型是 unsigned int 还是 NSUInteger?
NSUInteger
开始为enum
类型赋值,然后稍后决定给它一个负值并忘记从类型中删除U
,那么很容易出现这种情况。希望这能为某些人节省时间。 - Beltalowda