Как именно работают enum перечисления

Не могу понять как работают перечисления с точки зрения выделения памяти. Вот есть перечисление:

enum Colors
{
WHITE,
YELLOW,
GREEN
};

Память тут еще не выделена - ведь так? Мы по сути создали шаблон. Но если память не выделена, то почему я могу присвоить переменной значение одного из перечислителей?

int main
{

int a = YELLOW;
}

int a получила значение 1, которое по умолчанию получил перечислитель YELLOW 1, но как? Я ведь даже не создавал обьект типа Colors, как это нужно в случае enum class


Ответы (2 шт):

Автор решения: AlexGlebe

enum объявляют не переменные, а именованные числа. Никаких областей памяти для этого не выделяется. Очень похоже работает макрос define.

# define dYELLOW 2
enum Colors { eYELLOW = 2 } ;
int x = dYELLOW ;
int y = eYELLOW ;

Но в enum есть область видимости в пространстве имён Colors. А в макросе до ручного уничтожения #undef.

Тип в перечислениях enum это int (по-умолчанию). А в макросе всё-что угодно.


Если непонятно, где все эти числа в программе, то посмотрите ассемблерный код :

x:
    .long   2
y:
    .long   2

В ассемблере есть переменные x и y. Им при старте программы заданы числа 2. Никаких именованных числел dYELLOW и eYELLOW в коде нет.

→ Ссылка
Автор решения: Harry

Вас же не смущает, например,

#define YELLOW 1
int a = YELLOW;

при том, что вы ничего не создавали? :) По сути, enum и есть, как вы сказали, шаблон. Только в нем, пока не сказано иное, нумерация идет от 0. Но вы в любой момент можете ее изменить -

enum Val {
    A,       // 0
    B,       // 1
    С = 15,  // 15
    D,       // 16 (продолжение счета)
    E        // 17
};
→ Ссылка