tl;博士版本
因此,在声明枚举时,如何保证枚举常量的数据类型是 NSUInteger 而不是 unsigned int:
enum {
NSNullCellType = 0,
NSTextCellType = 1,
NSImageCellType = 2
};
typedef NSUInteger NSCellType;
NSUInteger 的 typedef 似乎没有以任何方式与 enum 声明相关联。
完整版本
我正在阅读 Apple 的64-Bit Transition Guide for 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 位,都可能发生这种情况。不用说,这种情况给二进制兼容性带来了障碍。
为了解决这个问题,Apple 决定在 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?