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

标签 objective-c enums header typedef anonymous-types

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

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

这给我留下了几个问题。

  1. 他们为什么使用匿名枚举?这种方法有优势吗?
  2. 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/

相关文章:

java - Java 1.4 中枚举的替代品

http - HTTP header 的使用

ios - 如何在 SCLAlertView showWaiting 警报后重定向到主页?

objective-c - iPhone MPMoviePlayerController 在真实设备上播放视频时失去声音

作为枚举/常量的 php 方法参数

c++ - (C++) .h 文件中的整个类?

C++ 如何解决 header 中的命名空间未定义的问题?

ios - nil中的managedObjectModel(仅在WatchApp中)

objective-c - 从 cocoa 应用程序内部运行 WPS

java - 复杂枚举的联合测试