Я создаю набор значений перечисления, но мне нужно, чтобы каждое значение перечисления было шириной 64 бита. Если я правильно помню, enum обычно имеет тот же размер, что и int; но я думал, что где-то читал, что (по крайней мере, в GCC) компилятор может сделать перечисление любой ширины, необходимой для хранения их значений. Итак, возможно ли иметь перечисление шириной 64 бита?
142
Ответы:
enum
Гарантируется, что An будет достаточно большим для храненияint
значений. Компилятор может выбрать фактический используемый тип на основе определенных констант перечисления, поэтому он может выбрать меньший тип, если он может представлять определяемые вами значения. Если вам нужны константы перечисления, которые не подходят,int
вам нужно будет использовать для этого расширения, специфичные для компилятора.источник
enum
должно быть большеint
или меньше? После ответа @MichaelStum ваше первое предложение должно быть «enum
Гарантированно соответствует толькоint
значению».int
. Ответ Майкла Стама , который ссылается на C99, говорит, что перечисление может быть размером сchar
.enum
Только гарантированно быть достаточно большим , чтобы удерживать значение наибольшего переписчика в перечислении.Взято из текущего стандарта C (C99): http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf
Не то, чтобы компиляторы хорошо следовали стандарту, но по сути: если ваше перечисление содержит что-то еще, кроме int, вы находитесь в глубоком «неподдерживаемом поведении», которое может снова укусить вас через год или два.
источник
int
short
long
int
, фактическая переменная перечисления может быть другого типа. Это известное несоответствие в стандарте.enum my_enum { my_value }
,my_value
будет иметь типint
, ноenum my_enum
может иметь определенный тип реализации , которые должны , по крайней мере , представлять все значения перечисления. Такmy_value
может быть сужающееся преобразование вenum my_enum
, но гарантированно не переполнение.Хотя предыдущие ответы верны, у некоторых компиляторов есть варианты, позволяющие нарушить стандарт и использовать наименьший тип, который будет содержать все значения.
Пример с GCC (документация в GCC Manual ):
enum ord { FIRST = 1, SECOND, THIRD } __attribute__ ((__packed__)); STATIC_ASSERT( sizeof(enum ord) == 1 )
источник
Просто установите последнее значение перечисления на значение, достаточно большое, чтобы сделать его размер, который вы хотите, чтобы перечисление было, тогда оно должно быть такого же размера:
enum value{a=0,b,c,d,e,f,g,h,i,j,l,m,n,last=0xFFFFFFFFFFFFFFFF};
источник
У нас нет контроля над размером
enum
переменной. Это полностью зависит от реализации, и компилятор дает возможность сохранить имя для целого числа с помощьюenum
, поэтомуenum
следует размер целого числа.источник
На языке C
enum
гарантированно будет иметь размерint
. Существует опция времени компиляции (-fshort-enums
), чтобы сделать его как можно более коротким (это в основном полезно в случае, если значения не превышают 64 КБ). Во время компиляции нет возможности увеличить его размер до 64 бит.источник
Рассмотрим этот код:
enum value{a,b,c,d,e,f,g,h,i,j,l,m,n}; value s; cout << sizeof(s) << endl;
На выходе будет 4. Таким образом, независимо от количества элементов, которые он
enum
содержит, его размер всегда фиксирован.источник