Цель 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;
Может быть, это помогает прояснить ситуацию?