是否需要将原始类型键入枚举?
我正在查看 NSString
头文件,看看 Apple 是如何编写枚举的,并发现了这段代码:
enum {
NSStringEncodingConversionAllowLossy = 1,
NSStringEncodingConversionExternalRepresentation = 2
};
typedef NSUInteger NSStringEncodingConversionOptions;
这给我留下了几个问题。
- 他们为什么使用匿名枚举?这种方法有优势吗?
- 通常包含
typedef NSUInteger NSStringEncodingConversionOptions;
行是一个好主意,还是仅在此处使用它,因为它们声明了匿名枚举?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这个看起来很奇怪的定义是为了在 64 位和 32 位环境中清楚地定义代码中枚举的位宽和符号。详细信息请参见Apple 文档,但让我在这里写下摘要。
Apple 过去使用过标准 typedef 枚举,就像在
(重新)引入 64 位-32 位通用二进制文件之前一样。 (我使用“re”是因为 FAT 二进制文件从 NeXTStep 时代起就已经存在了。)
但是,这使得 typedef 类型
NSEnumTypeName
的位宽和符号性变为实现定义如官方中指定标准,见6.7.2.2.4。这使得编写可以使用各种编译器和各种位宽进行编译的代码变得更加棘手。
因此,Apple 从标准枚举切换到匿名枚举,并将相应的 typedef 转换为特定的有符号/无符号整数类型。
That strange-looking definition is there to clearly define the bit-width and the signed-ness of an enum in a code both in 64-bit and 32-bit environment. It's detailed in this Apple document, but let me write down the summary here.
Apple in the past used the standard typedef enums before, as in
before 64bit-32bit universal binaries were (re)introduced. (I used "re" because the FAT binaries have been there since the NeXTStep days. Anyway.)
However, this makes the bit-width and the signed-ness of the typedef'd type
NSEnumTypeName
to be implementation-defined as specified in the Official Standard, see 6.7.2.2.4.That makes it even trickier to write a code which can be compiled with various compilers and with various bit-width.
So Apple switched from the standard enum to the anonymous enum with a corresponding typedef to a specific signed/unsigned integer type.