我正在浏览NSString
查看头文件,看看 Apple 如何编写枚举,并发现了这段代码:
enum {
NSStringEncodingConversionAllowLossy = 1,
NSStringEncodingConversionExternalRepresentation = 2
};
typedef NSUInteger NSStringEncodingConversionOptions;
这给我留下了几个问题。
- 他们为什么使用匿名枚举?这种方法有优势吗?
- Is the
typedef NSUInteger NSStringEncodingConversionOptions;
line 是一个正常包含的好主意,或者它只是在这里使用,因为他们声明了一个匿名枚举?
这个看起来很奇怪的定义是为了在 64 位和 32 位环境中清楚地定义代码中枚举的位宽和符号性。这个里面有详细的介绍苹果文档 http://developer.apple.com/library/mac/documentation/cocoa/conceptual/Cocoa64BitGuide/64BitChangesCocoa/64BitChangesCocoa.html#//apple_ref/doc/uid/TP40004247-CH4-SW8,但让我在这里写下摘要。
Apple 过去使用过标准的 typedef 枚举,如下所示
typedef enum { .... } NSEnumTypeName;
在(重新)引入 64 位-32 位通用二进制文件之前。 (我使用“re”是因为 FAT 二进制文件从 NeXTStep 时代起就已经存在了。无论如何。)
然而,这使得 typedef 类型的位宽和符号性NSEnumTypeName
按照中指定的实现定义官方标准 http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf,见 6.7.2.2.4。
这使得编写可以使用各种编译器和各种位宽进行编译的代码变得更加棘手。
因此,Apple 从标准枚举切换到匿名枚举,并将相应的 typedef 转换为特定的有符号/无符号整数类型。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)