Цель C - когда «typedef» должен предшествовать «enum», и когда enum должен быть назван? - PullRequest
15 голосов
/ 03 апреля 2010

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

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

и это:

typedef enum {Bob, Mary, John} EmployeeName;

и это:

typedef enum {Bob, Mary, John};

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

enum {Bob, Mary, John};

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

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

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

Ответы [ 3 ]

22 голосов
/ 03 апреля 2010

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

enum MyEnum enumVar;

Сделав typedef:

typedef MyEnum MyEnumT;

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

MyEnumT enumVar;

Альтернативные объявления объявляют сам enum и 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};
4 голосов
/ 03 апреля 2010

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

0 голосов
/ 03 апреля 2010

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

warning: useless storage class specifier in empty declaration

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

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

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

...