В примере кода я видел это:
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".", было бы хорошо, если список открывается, показывая, каков перечислимый выбор.
В 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};
Ваш третий пример такой же, как и ваш последний пример - typedef
бесполезен - GCC даже выдает предупреждение об этом случае:
warning: useless storage class specifier in empty declaration
Ваш первый и второй пример также частично эквивалентны, поскольку оба дают типу перечисления имя EmployeeName
. Первый пример также позволяет использовать enum Ename
взаимозаменяемо с EmployeeName
; во втором примере EmployeeName
- единственный вариант. Второй пример должен быть написан так же, как и вы - вы можете разложить первый пример следующим образом:
enum Ename { Bob, Mary, John };
typedef enum Ename EmployeeName;
Может быть, это поможет прояснить ситуацию?
Имена внутри enum {}
определяют перечисляемые значения. Когда вы даете ему имя, вы можете использовать его как тип вместе с ключевым словом enum
, например перечисление EmployeeName b = Bob;
. Если вы также typedef
it, тогда вы можете отбросить перечисление
при объявлении переменных этого типа, например EmployeeName b = Bob;
вместо предыдущего примера.