Objective C - когда “определение типа” должно предшествовать “перечислению”, и когда перечисление нужно назвать?

В примере кода я видел это:

typedef enum Ename { Bob, Mary, John} EmployeeName;

и это:

typedef enum {Bob, Mary, John} EmployeeName;

и это:

typedef enum {Bob, Mary, John};

но то, что скомпилировало успешно для меня, было этим:

enum {Bob, Mary, John};

Я поместил ту строку в.h файл выше @interface строки, и затем когда я #import, что.h файл в.m файл другого класса, методы там видят перечисление.

Так, когда другие варианты необходимы?

Если я мог бы назвать перечисление чем-то как EmployeeNames, и затем, когда я ввожу "EmployeeNames", сопровождаемый a".", было бы хорошо, если список открывается, показывая, каков перечислимый выбор.

15
задан Scott Pendleton 2 April 2010 в 21:24
поделиться

3 ответа

В C (и, следовательно, в Objective C), Тип перечисления должен иметь префикс enum каждый раз, когда вы его используете.

enum MyEnum enumVar;

Сделав typedef:

typedef MyEnum MyEnumT;

Вы можете написать короче:

MyEnumT enumVar;

Альтернативные объявления объявляют само перечисление и typedef в одном объявлении.

// gives the enum itself a name, as well as the typedef
typedef enum Ename { Bob, Mary, John} EmployeeName;

// leaves the enum anonymous, only gives a name to the typedef
typedef enum {Bob, Mary, John} EmployeeName;

// leaves both anonymous, so Bob, Mary and John are just names for values of an anonymous type
typedef enum {Bob, Mary, John};
22
ответ дан 1 December 2019 в 02:46
поделиться

Ваш третий пример такой же, как и ваш последний пример - typedef бесполезен - GCC даже выдает предупреждение об этом случае:

warning: useless storage class specifier in empty declaration

Ваш первый и второй пример также частично эквивалентны, поскольку оба дают типу перечисления имя EmployeeName . Первый пример также позволяет использовать enum Ename взаимозаменяемо с EmployeeName ; во втором примере EmployeeName - единственный вариант. Второй пример должен быть написан так же, как и вы - вы можете разложить первый пример следующим образом:

enum Ename { Bob, Mary, John };
typedef enum Ename EmployeeName;

Может быть, это поможет прояснить ситуацию?

0
ответ дан 1 December 2019 в 02:46
поделиться

Имена внутри enum {} определяют перечисляемые значения. Когда вы даете ему имя, вы можете использовать его как тип вместе с ключевым словом enum , например перечисление EmployeeName b = Bob; . Если вы также typedef it, тогда вы можете отбросить перечисление при объявлении переменных этого типа, например EmployeeName b = Bob; вместо предыдущего примера.

4
ответ дан 1 December 2019 в 02:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: