Каков базовый тип перечисления С++?
На это можно было ответить в другом месте, но я не смог найти подходящий ответ.
У меня есть этот код:
enum enumWizardPage
{
WP_NONE = 0x00,
WP_CMDID = 0x01,
WP_LEAGUES = 0x02,
WP_TEAMS = 0x04,
WP_COMP = 0x08,
WP_DIVISIONS = 0x10,
WP_FORMULAS = 0x20,
WP_FINISHED = 0x40,
};
Это наследие, и я должен его изменить, добавив несколько новых значений.
Проблема заключается в том, что каждое значение должно быть уникальным битом, поэтому они могут быть объединены с битовой картой.
Значения устанавливаются с использованием формата # x ## hex, но мне интересно, можно ли это сохранить максимум?
Каким будет эффект, если таковой будет, если я изменю свой код на
enum enumWizardPage
{
WP_NONE = 0x0000,
WP_CMDID = 0x0001,
WP_LEAGUES = 0x0002,
WP_TEAMS = 0x0004,
WP_COMP = 0x0008,
WP_DIVISIONS = 0x0010,
WP_FORMULAS = 0x0020,
WP_FINISHED = 0x0040,
};
Ответы
Ответ 1
Из N4659 C++ 7.2/5:
Для перечисления, базовый тип которого не является фиксированным, базовый тип является целочисленным типом, который может представлять все значения перечислителя, определенные в перечислении. Если ни один целочисленный тип не может представлять все значения перечислителя, перечисление неверно сформировано. Определяется реализацией, какой интегральный тип используется в качестве базового типа, за исключением того, что базовый тип не должен быть больше, чем int
если только значение перечислителя не может поместиться в int
или unsigned int
. Если список-перечислитель пуст, базовый тип такой, как если бы перечисление имело единственный перечислитель со значением 0.
Ответ 2
Тип перечисления С++ - это перечисление. Его диапазон довольно произволен, но с практической точки зрения его базовый тип - int
.
Он неявно добавляется к int
, где бы он ни использовался.
Изменения в С++ 11
Это изменилось с С++ 11, в котором введены типизированные перечисления. Теперь нетипизированная enum
определяется как имеющая, по меньшей мере, ширину int
(и более широкую, если необходимы большие значения). Однако, учитывая типизированный enum
, определенный следующим образом:
enum name : type {};
Перечисление типа name
имеет базовый тип type
. Например, enum : char
определяет enum
ту же ширину, что и char
вместо int
.
Кроме того, a enum
можно явно охватить следующим образом:
enum class name : type {
value = 0,
// ...
};
(Где требуется name
, но type
не является обязательным.) Объявленный таким образом enum
больше не будет неявным образом отбрасывать его базовый тип (требующий static_cast<>
), а значения должны быть указаны с полным -квалифицированное имя. В этом примере для назначения value
переменной enum
необходимо ссылаться на нее как name::value
.
Ответ 3
IIRC его представляется как int в памяти. Но gcc имеет переключатель -fshort-enum
, чтобы сделать его кратчайшим целочисленным типом, который соответствует всем значениям, если вам нужно сэкономить место. Другие компиляторы будут иметь что-то подобное.
Ответ 4
Основной тип - это наименьшее целое число со знаком, соответствующее наибольшему/наименьшему значению вашего перечисления.