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

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

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

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

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

enum ord {
    FIRST = 1,
    SECOND,
    THIRD
} __attribute__ ((__packed__));
STATIC_ASSERT( sizeof(enum ord) == 1 )

Ответ 4

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

Ответ 5

Мы не можем контролировать размер переменной enum. Это полностью зависит от реализации, и компилятор дает возможность сохранить имя для целого числа, используя enum, поэтому enum следует размеру целого числа.

Ответ 6

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

Ответ 7

Рассмотрите этот код:

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

Это даст 4 в качестве вывода. Поэтому независимо от количества элементов, содержащихся в enum, его размер всегда фиксирован.