Явное объявление перечисления с определением типа в C ++: это необходимо? - PullRequest
0 голосов
/ 28 апреля 2020

Мне было интересно, эквивалентны ли объявления C ++

enum colour {blue, green, red};

и

typedef enum {blue, green, red} colour;

, если перечисление само по себе является типом , как я понял из ответа и ссылок в Какие типы в C ++ являются перечисляемыми типами? . Я столкнулся с последним объявлением в каком-то коде, который я изучаю.

Различаются ли два объявления по значению, выразительности (скажем, ясности) или возможностям, которые они открывают при кодировании?

1 Ответ

0 голосов
/ 28 апреля 2020

Разница между этими двумя объявлениями

enum colour {blue, green, red};

typedef enum {blue, green, red} colour;

влияет на поиск имени.

Для первого объявления, даже если имя colour скрыто, вы можете использовать сложный имя enum colour

Вот демонстрационная программа

#include <iostream>

enum colour {blue, green, red};

int colour;

enum colour c = red;

int main() 
{
    return 0;
}.

Фактически для первого объявления вы вводите два имени: enum colour и colour

Для объявление typedef имя тега опущено. Поэтому вы не можете использовать подробное имя.

Также без ключевого слова enum вы не можете использовать непрозрачное объявление enum. И вы не можете вводить перечисления с областью видимости, такие как

enum class colour {blue, green, red};
...