小编Mic*_*Fey的帖子

枚举值:NSInteger还是int?

tl;博士版

在如此声明枚举时,枚举常量的数据类型如何保证为NSUInteger而不是unsigned int:

enum {
    NSNullCellType = 0,
    NSTextCellType = 1,
    NSImageCellType = 2
};
typedef NSUInteger NSCellType;
Run Code Online (Sandbox Code Playgroud)

NSUInteger的typedef似乎没有以任何方式绑定到枚举声明.

完整版本

我正在阅读Apple的64位Cocoa过渡指南,以获得有关枚举值的一些指导,我带来了一个问题.这是Enumeration Constants部分的一个(冗长的)引用,强调我的:

枚举(枚举)常量的一个问题是它们的数据类型经常是不确定的.换句话说,枚举常量不是可预测的unsigned int.对于传统构造的枚举,编译器实际上根据它找到的内容设置基础类型.底层类型可以是(signed)int或甚至long.请看以下示例:

type enum {
    MyFlagError = -1,
    MyFlagLow = 0,
    MyFlagMiddle = 1,
    MyFlagHigh = 2
} MyFlagType;
Run Code Online (Sandbox Code Playgroud)

编译器查看此声明,并查找分配给其中一个成员常量的负值,声明枚举int的基础类型.如果成员的值范围不适合int或unsigned int,则基类型将静默地变为64位(长整数).因此,定义为枚举的基本类型数量可以无提示地更改大小以符合枚举中的值.无论您是编译32位还是64位,都会发生这种情况.不用说,这种情况对二进制兼容性提出了障碍.

作为解决此问题的补救措施,Apple已决定更加明确Cocoa API中的枚举类型.现在,头文件不是根据枚举声明参数,而是单独声明可以指定大小的枚举类型.枚举的成员及其值将像以前一样声明和分配.例如,而不是这样:

typedef enum {
    NSNullCellType = 0,
    NSTextCellType = 1,
    NSImageCellType = 2
} NSCellType;
Run Code Online (Sandbox Code Playgroud)

现在有这个:

enum {
    NSNullCellType = 0,
    NSTextCellType = 1,
    NSImageCellType = 2
};
typedef NSUInteger …
Run Code Online (Sandbox Code Playgroud)

cocoa enums typedef objective-c nsinteger

39
推荐指数
3
解决办法
4万
查看次数

标签 统计

cocoa ×1

enums ×1

nsinteger ×1

objective-c ×1

typedef ×1