Цель C - когда следует "typedef" предшествовать "перечислению", и когда следует указывать перечисление?

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

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 файла, методы могут видеть перечисление.

Итак, когда нужны другие варианты?

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

Ответы

Ответ 1

В C (и, следовательно, Object 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};

Ответ 2

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

Ответ 3

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

warning: useless storage class specifier in empty declaration

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

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

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