Если я не создаю экземпляр перечисления, а просто имею:

Перечисление myEnum {значение1 = 0, значение2, значение3};

Мне интересно, все ли компилятор будет делать, это просматривать весь ваш код и заменять val1, val2 и т. Д. Соответствующими числами. Это означает, что это не будет создавать для него хранилище в вашей готовой программе. Фактически, конечный результат будет заключаться в замене постоянных значений везде, где вы написали val1, val2 и т. Д.?

Я не уверен, что «создать экземпляр» - правильное слово. Кроме того, когда я говорю, что он просматривает ваш код и заменяет материал, я не говорю, что он вставляет его, как с заменой макроса на этапе препроцессора. Спасибо.

-1
Zebrafish 26 Ноя 2016 в 09:54

2 ответа

Лучший ответ

Перечислителями перечисления являются prvalue, поэтому, когда вы используете val1 в исходном коде, это похоже на ввод литерала, такого как 42; вы не получите glvalue (который будет относиться к месту в памяти, где хранится фактическое значение). Компилятору не имеет смысла резервировать место в программе для счетчиков, поскольку доступ к этим ячейкам памяти никогда не будет осуществляться в соответствии с правилами языка.

Опять же, неужели у вас так мало памяти, что это имеет значение?

1
Brian 26 Ноя 2016 в 07:03

Стандарт описывает перечисление как:

[...] отдельный тип с именованными константами.

Поэтому да - конечным результатом будут постоянные значения, замененные везде, где вы написали val1, val2 и т. Д. .

1
skypjack 26 Ноя 2016 в 07:11