是否需要将原始类型键入枚举?

发布于 2024-11-03 04:46:49 字数 434 浏览 1 评论 0 原文

我正在查看 NSString 头文件,看看 Apple 是如何编写枚举的,并发现了这段代码:

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

这给我留下了几个问题。

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

I was looking through the NSString header file to see how Apple writes their enumerations and came across this piece of code:

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

This leaves me with a couple questions.

  1. Why have they used anonymous enumerations? Is this method advantageous?
  2. Is the typedef NSUInteger NSStringEncodingConversionOptions; line a good idea to include normally, or is it only used here because they have declared an anonymous enumeration?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

往日情怀 2024-11-10 04:46:49

这个看起来很奇怪的定义是为了在 64 位和 32 位环境中清楚地定义代码中枚举的位宽和符号。详细信息请参见Apple 文档,但让我在这里写下摘要。

Apple 过去使用过标准 typedef 枚举,就像在

typedef enum { .... } NSEnumTypeName;

(重新)引入 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

typedef enum { .... } NSEnumTypeName;

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文