Подтвердить что ты не робот

Каков базовый тип перечисления С++?

На это можно было ответить в другом месте, но я не смог найти подходящий ответ.

У меня есть этот код:

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,   
};
4b9b3361

Ответ 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

Основной тип - это наименьшее целое число со знаком, соответствующее наибольшему/наименьшему значению вашего перечисления.