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

时间:2011-04-21 18:58:13

标签: objective-c enums header typedef anonymous-types

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

enum {
    NSStringEncodingConversionAllowLossy = 1,
    NSStringEncodingConversionExternalRepresentation = 2
};
typedef NSUInteger NSStringEncodingConversionOptions;

这给我留下了几个问题。

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

1 个答案:

答案 0 :(得分:5)

这个奇怪的定义是在64位和32位环境中清楚地定义代码中枚举的位宽和符号。详情请参阅Apple document,但请在此处写下摘要。

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

typedef enum { .... } NSEnumTypeName;

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

但是,这会使typedef类型NSEnumTypeName的位宽和签名定义为Official Standard中指定的实现定义,请参见6.7.2.2.4。 / p>

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

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