是否需要将基元类型定义为枚举?

Fre*_*eer 4 enums typedef header objective-c anonymous-types

我正在查看NSString头文件,看看Apple如何编写枚举并遇到这段代码:

enum {
    NSStringEncodingConversionAllowLossy = 1,
    NSStringEncodingConversionExternalRepresentation = 2
};
typedef NSUInteger NSStringEncodingConversionOptions;
Run Code Online (Sandbox Code Playgroud)

这给我留下了几个问题.

  1. 为什么他们使用匿名枚举?这种方法有利吗?
  2. typedef NSUInteger NSStringEncodingConversionOptions;行是否是正常包含的好主意,还是仅在此使用,因为它们声明了匿名枚举?

Yuj*_*uji 5

这个奇怪的定义是在64位和32位环境中清楚地定义代码中枚举的位宽和符号.这篇Apple文档中有详细介绍,但让我在这里写下摘要.

Apple过去曾使用过标准的typedef枚举,如同

typedef enum { .... } NSEnumTypeName;
Run Code Online (Sandbox Code Playgroud)

在重新引入64位-32位通用二进制文件之前.(我使用了"re",因为自NeXTStep天以来FAT二进制文件一直存在.无论如何.)

但是,这使得typedef类型的位宽和签名NSEnumTypeName按照官方标准的规定进行实现定义,见6.7.2.2.4.

这使得编写可以使用各种编译器和各种位宽编译的代码变得更加棘手.

因此Apple将标准枚举转换为匿名枚举,并将相应的typedef转换为特定的有符号/无符号整数类型.