В чем разница между объявлением перечисления с типом typedef и без него?

Стандартный способ объявления перечисления в С++ выглядит следующим образом:

enum <identifier> { <list_of_elements> };

Однако, я уже видел некоторые объявления вроде:

typedef enum { <list_of_elements> } <identifier>;

В чем разница между ними, если она существует? Какой из них правильный?

Ответы

Ответ 1

C.

В C, union, struct и enum типы должны использоваться с соответствующим ключевым словом перед ними:

enum x { ... };

enum x var;

В С++ это необязательно:

enum x { ... };

x var;

Итак, на C ленивые программисты часто используют typedef, чтобы не повторять себя:

typedef enum x { ... } x;

x var;

Ответ 2

Я считаю, что разница в том, что в стандарте C, если вы используете

enum <identifier> { list }

Вам нужно будет вызвать его, используя

enum <identifier> <var>;

Где, как и в typedef вокруг него, вы можете называть его, используя только

<identifier> <var>;

Однако, я не думаю, что это имело бы значение в С++

Ответ 3

Подобно тому, что сказал @Chris Lutz:

В синтаксисе old-C, если вы просто объявили:

enum myEType {   ... };

Затем вам нужно было объявить переменные как:

enum myEType myVariable;

Однако, если вы используете typedef:

typedef enum {   ... } myEType;

Затем вы можете пропустить ключевое слово enum при использовании типа:

myEType myVariable;

С++ и родственные языки покончили с этим ограничением, но его все еще распространено, чтобы увидеть код, подобный этому, либо в чистой среде C, либо когда написан программистом C.