我正在查看NSString
头文件,看看Apple是如何编写枚举的,并遇到了这段代码:
enum {
NSStringEncodingConversionAllowLossy = 1,
NSStringEncodingConversionExternalRepresentation = 2
};
typedef NSUInteger NSStringEncodingConversionOptions;
这给我留下了几个问题。
- 他们为什么使用匿名枚举?这种方法有利吗?
-
typedef NSUInteger NSStringEncodingConversionOptions;
行是一个好主意,包括正常,或者它只是在这里使用,因为他们已经声明了一个匿名枚举?
这个奇怪的定义是为了在64位和32位环境中清楚地定义枚举的位宽和有符号性。在苹果的文档中有详细说明,但让我在这里写下总结。
Apple以前使用过标准类型定义枚举,如
typedef enum { .... } NSEnumTypeName;
在64位-32位通用二进制文件(重新)引入之前。(我用了"re",因为FAT二进制文件从NeXTStep开始就在那里了。无论如何。)
但是,这使得类型定义类型NSEnumTypeName
的位宽度和符号性按照官方标准中指定的实现定义,参见6.7.2.2.4。
这使得编写可以用不同的编译器和不同的位宽进行编译的代码变得更加棘手。
所以苹果从标准枚举切换到匿名枚举,并相应的类型定义为特定的有符号/无符号整数类型