Каков размер перечисления в C?

Я создаю набор значений перечисления, но мне нужно, чтобы каждое значение перечисления было шириной 64 бита. Если я правильно помню, enum обычно имеет тот же размер, что и int; но мне показалось, что я где-то читал, что (по крайней мере, в GCC) компилятор может сделать enum любой ширины, необходимой для хранения своих значений. Итак, возможно ли иметь перечисление шириной 64 бита?

6 ответов

Решение

enum гарантированно будет достаточно большим, чтобы держать int ценности. Компилятор может свободно выбирать фактический используемый тип на основе определенных констант перечисления, чтобы он мог выбирать меньший тип, если он может представлять определенные вами значения. Если вам нужны константы перечисления, которые не вписываются в int для этого вам нужно будет использовать специфичные для компилятора расширения.

Взято из текущего стандарта C (C99): http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf

6.7.2.2 Спецификаторы перечисления
[...]
Ограничения
Выражение, которое определяет значение константы перечисления, должно быть выражением целочисленной константы, значение которого представлено в виде целого числа.
[...]
Каждый перечисляемый тип должен быть совместим с типом char, целочисленным типом со знаком или целочисленным типом без знака. Выбор типа определяется реализацией, но должен быть способен представлять значения всех членов перечисления.

Не то, чтобы компиляторы были хорошими в следовании стандарту, но по сути: если ваш enum содержит что-то кроме int, вы находитесь в глубоком "неподдерживаемом поведении, которое может вернуться, кусая вас через год или два".

Хотя предыдущие ответы верны, некоторые компиляторы могут нарушать стандарт и использовать наименьший тип, который будет содержать все значения.

Пример с GCC (пояснение в руководстве GCC):

enum ord __attribute__ ((__packed__)) {
    FIRST = 1,
    SECOND,
    THIRD
};
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 следует размеру целого числа.

На языке Си enum гарантированно имеет размер int. Есть опция времени компиляции (-fshort-enums) сделать его как можно более коротким (это в основном полезно, если значения не превышают 64 КБ). Нет времени компиляции, чтобы увеличить его размер до 64 бит.

Размер хранилища не зависит от количества значений в перечислении. Размер хранилища определяется реализацией, но в основном это sizeof(int),

Рассматривать:

enum value{a,b,c,d,e,f,g,h,i,j,l,m,n};
value s;
cout << sizeof(s) << endl;

Это даст вывод как 4. Таким образом, независимо от того, сколько элементов содержится в перечислении, его размер всегда фиксирован.

Другие вопросы по тегам