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

4

我正在查看 NSString 头文件,以了解苹果是如何编写他们的枚举的。我发现了下面这段代码:

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

这给我留下了几个问题。
  1. 为什么他们使用匿名枚举?这种方法有什么优势吗?
  2. typedef NSUInteger NSStringEncodingConversionOptions; 这一行通常是一个好主意吗,还是仅在此处声明匿名枚举时使用?
1个回答

5
那个看起来奇怪的定义是为了在64位和32位环境下清晰地定义枚举的位宽和有符号性。这在这篇苹果文档中详细说明,但让我在这里写下摘要。
过去,苹果使用标准的typedef枚举,如下所示:
typedef enum { .... } NSEnumTypeName;

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

然而,这使得typedef类型的位宽和符号性质变成了实现定义,如官方标准中所述的6.7.2.2.4节。

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

因此,苹果公司从标准枚举切换到匿名枚举并对应一个特定的带符号/无符号整数类型进行了typedef。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接