tl; dr Версия
Как типы данных констант перечисления гарантированно являются NSUInteger вместо unsigned int при объявлении перечисления таким образом:
enum {
NSNullCellType = 0,
NSTextCellType = 1,
NSImageCellType = 2
};
typedef NSUInteger NSCellType;
typedef для NSUInteger никак не привязывается к объявлению перечисления.
Полная версия
Я читал через Apple 64-битное руководство по переходу для Cocoa для некоторых рекомендаций по значениям перечисления, и я ушел с вопрос. Здесь (длинная) цитата из раздела Enumeration Constants, основное внимание:
Проблема с константами перечисления (enum) заключается в том, что их типы данных часто являются неопределенными. Другими словами, константы континуума не являются предсказуемыми беззнаковыми int.. С условно сконструированными перечислениями компилятор фактически устанавливает базовый тип в зависимости от того, что он находит. Основной тип может быть (подписан) int или даже длинным. Возьмем следующий пример:
type enum {
MyFlagError = -1,
MyFlagLow = 0,
MyFlagMiddle = 1,
MyFlagHigh = 2
} MyFlagType;
Компилятор просматривает это объявление и, обнаруживая отрицательное значение, назначенное одной из констант-членов, объявляет базовый тип перечисления int. Если диапазон значений для членов не вписывается в int или unsigned int, тогда базовый тип становится 64-битным (длинным). Таким образом, базовый тип величин, определяемый как перечисления, может изменять молчащий размер, чтобы соответствовать значениям в перечислении. Это может произойти, если вы компилируете 32-разрядные или 64-разрядные. Излишне говорить, что эта ситуация создает препятствия для совместимости двоичных файлов.
В качестве средства для решения этой проблемы Apple решила более подробно описать тип перечисления в API Cocoa. Вместо объявления аргументов в терминах перечисления файлы заголовков теперь отдельно объявить тип для перечисления, размер которого можно указать. Члены перечисления и их значения объявляются и назначаются по-прежнему. Например, вместо этого:
typedef enum {
NSNullCellType = 0,
NSTextCellType = 1,
NSImageCellType = 2
} NSCellType;
теперь есть следующее:
enum {
NSNullCellType = 0,
NSTextCellType = 1,
NSImageCellType = 2
};
typedef NSUInteger NSCellType;
Тип перечисления определяется в терминах NSInteger или NSUInteger, чтобы сделать базовый тип перечисления 64-разрядным для 64-разрядных архитектур.
Мой вопрос заключается в следующем: учитывая, что typedef явно не привязан явно к объявлению enum, как узнать, являются ли их типы данных неподписанными int или NSUInteger?