2011-04-21 72 views
4

我一直在尋找通過NSString頭文件,看看蘋果如何寫自己的枚舉和跨越這段代碼傳來:是否需要將基本類型輸入到枚舉?

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

這給我留下了一對夫婦的問題。

  1. 他們爲什麼使用匿名枚舉?這種方法是否有利?
  2. typedef NSUInteger NSStringEncodingConversionOptions;是否是一個正常包含的好主意,還是僅在此處使用,因爲它們聲明瞭匿名枚舉?

回答

5

這個奇怪的定義是爲了在64位和32位環境下明確定義代碼中枚舉的位寬和符號。這在Apple document中詳細介紹,但讓我在這裏寫下總結。

蘋果在過去之前使用的標準的typedef枚舉,如

typedef enum { .... } NSEnumTypeName; 

64位,32位通用二進制代碼進行了介紹(重新)前。 (我使用「re」,因爲自從NeXTStep開始,FAT二進制文件就已經存在了)無論如何。

然而,這使得typedef'd類型NSEnumTypeName的位寬和符號被定義爲實現如Official Standard中所述,見6.7.2.2.4。

這使得寫一個可以用各種編譯器編譯並具有各種位寬的代碼變得更加棘手。

因此,Apple將標準枚舉切換爲匿名枚舉,並將相應的typedef轉換爲特定的有符號/無符號整數類型。