Каков размер перечисления в C? - PullRequest
132 голосов
/ 14 декабря 2008

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

Ответы [ 6 ]

90 голосов
/ 14 декабря 2008

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

89 голосов
/ 14 декабря 2008

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

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

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

14 голосов
/ 05 июня 2014

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

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

enum ord __attribute__ ((__packed__)) {
    FIRST = 1,
    SECOND,
    THIRD
};
STATIC_ASSERT( sizeof(enum ord) == 1 )
0 голосов
/ 29 декабря 2017

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

0 голосов
/ 23 января 2017

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

0 голосов
/ 14 ноября 2015

Рассмотрим:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...