Обязательно ли указывать примитивный тип для перечисления? - PullRequest
4 голосов
/ 21 апреля 2011

Я просматривал заголовочный файл NSString, чтобы увидеть, как Apple пишет свои перечисления и наткнулся на этот фрагмент кода:

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

Это оставляет мне пару вопросов.

  1. Почему они использовали анонимные перечисления? Этот метод выгоден?
  2. Является ли строка typedef NSUInteger NSStringEncodingConversionOptions; хорошей идеей для нормального включения, или она используется здесь только потому, что они объявили анонимное перечисление?

1 Ответ

5 голосов
/ 21 апреля 2011

Это странное определение предназначено для четкого определения ширины в битах и ​​подписи перечисления в коде как в 64-битной, так и в 32-битной среде.Это подробно описано в этом документе Apple , но позвольте мне записать здесь краткую сводку.

Ранее Apple ранее использовала стандартные перечисления typedef, как в

typedef enum { .... } NSEnumTypeName;

до того, как были введены (пере) 64-разрядные универсальные двоичные файлы(Я использовал «re», потому что двоичные файлы FAT были там с дней NeXTStep. В любом случае.)

Однако это делает битовую ширину и подпись typedef-типа NSEnumTypeName равнымибыть определенным реализацией, как указано в Официальном стандарте , см. 6.7.2.2.4.

Это делает еще более сложным написание кода, который может быть скомпилирован с различными компиляторами и с различным бит-width.

Таким образом, Apple перешла со стандартного перечисления на анонимное перечисление с соответствующим typedef на определенный целочисленный тип со знаком / без знака.

...