Intereting Posts
IPC vs domain sock vs named pipes Печать строк из текстового файла в обратном порядке undefined symbol: PyExc_ImportError при вложении Python в C Правила большого пальца для минимизации ошибок с плавающей запятой в C? Нет ли синтаксической ошибки? Если printf («один», «два» и «% s. \ N», «три»); быть действительным кодом? Как обнаружить пользователя, зарегистрированного через GUI в Linux Перекрестный компилятор glibc для руки, получил неопределенное указание на некоторые функции размотки Slack byte в структурах C Проверьте, является ли строка палиндром в C Как перенаправить ошибки RUNTIME в STDERR? Очень медленная обработка моего приложения Opencv Можно ли установить массив C int как значение ключа в Redis by hiredis? Имеет ли C тип строки? Поддерживает ли ANSI C подписанные / неподписанные битовые поля? Как я могу использовать регулярное выражение для определения существования и размера групп файлов в C / C ++ в Linux?

sizeof enum на языке C

Как я могу узнать размер Days enums? Будет ли оно равно 7*4(sizeof(int)) = 28 ??
printf() здесь дает мне значение 4 , как это можно объяснить?

 enum Days { saturday, sunday , monday , tuesday, wednesday, thursday, friday } TheDay; printf("%d", sizeof(enum Days)); 

Также мы можем использовать это как (enum Days) (0), которое аналогично целочисленному массиву. Если размер равен 4, то как можно объяснить это поведение типа массива?

В C все enums в большинстве случаев являются целыми числами типа int , что объясняет, почему sizeof(Days) == 4 для вас.

Чтобы узнать, сколько значений указано в enum вы можете сделать что-то вроде этого:

 enum Days { saturday, sunday, monday, tuesday, wednesday, thursday, friday, NUM_DAYS }; 

Тогда NUM_DAYS будет числом перечислений в Days .

Обратите внимание, что это не будет работать, если вы измените значения enums, например:

 enum Foo { bar = 5, NUM_FOO }; 

В приведенном выше перечислении NUM_FOO будет 6 .

Это зависит от реализации. Только перечисление гарантировано будет достаточно большим для хранения целочисленных значений.

Ссылка:
Стандарт C99 6.7.2.2 Спецификаторы enums

Ограничения
2 Выражение, определяющее значение константы enums, должно быть целочисленным константным выражением, которое имеет значение, представляемое как int.

4 Каждый перечисленный тип должен быть совместим с символом char, целочисленным типом со знаком или беззнаковым целым типом. Выбор типа определяется реализацией, 128), но должен быть способен представлять значения всех членов enums . Перечисленный тип является неполным, пока сразу после {}, который завершает список деклараций перечислителя и завершается после этого.

В C тип enums представляет собой целочисленный тип реализации, который может представлять все константы enums в перечислении.

С gcc если в константах enums нет отрицательного значения, тип определенного реализации не имеет значения unsigned int иначе он является int .

http://gcc.gnu.org/onlinedocs/gcc/Structures-unions-enumerations-and-bit_002dfields-implementation.html

Тип enums не следует путать с константами enums. Константы континуума имеют тип int .

enum обычно имеет размер int . Его тип, а не массив или структура, поэтому я не понимаю, почему вы ожидаете, что это будет 28.

С помощью компилятора, который я использую прямо сейчас, sizeof(enum) зависит от самого большого значения. Если все значения enum <= 0xFF размер 1 байт, но если есть значение 0x100 тогда размер будет на 2 байта ... Просто добавление значений в enum может изменить результат sizeof(MyEnum)