我正在查看 NSString
头文件以查看 Apple 如何编写他们的枚举并遇到了这段代码:
enum {
NSStringEncodingConversionAllowLossy = 1,
NSStringEncodingConversionExternalRepresentation = 2
};
typedef NSUInteger NSStringEncodingConversionOptions;
这给我留下了几个问题。
- 他们为什么使用匿名枚举?这种方法有优势吗?
typedef NSUInteger NSStringEncodingConversionOptions;
行是正常包含的好主意,还是只在这里使用,因为它们声明了匿名枚举?
最佳答案
那个看起来很奇怪的定义是为了在 64 位和 32 位环境中清楚地定义代码中枚举的位宽和符号性。在这个Apple document中有详细说明,但让我在这里写下摘要。
Apple 过去使用标准的 typedef 枚举,如
typedef enum { .... } NSEnumTypeName;
在(重新)引入 64 位-32 位通用二进制文件之前。 (我使用“re”是因为自从 NeXTStep 时代以来 FAT 二进制文件就已经存在了。无论如何。)
但是,这使得 typedef 类型 NSEnumTypeName
的位宽和符号性按照 Official Standard 中的规定实现定义。 ,见6.7.2.2.4。
这使得编写可以使用各种编译器和各种位宽编译的代码变得更加棘手。
因此 Apple 从标准枚举切换到具有相应类型定义的匿名枚举到特定的有符号/无符号整数类型。
关于objective-c - 是否需要将基本类型定义为枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5748533/