У меня есть структура, предназначенная для использования 32-битного хранилища:
struct foo_t {
color_t color : 10
some_type_t some_field : 22;
}
, где color_t
— это перечисление, определенное как
typedef enum {
RED = 0,
// other values...
BLUE = 255
} color_t
Обратите внимание, что значения color_t
в настоящее время умещаются в 8 бит, хотя в будущем мы можем добавить больше значений (таким образом, мы зарезервировали 10 бит для color
).
В C99 мне интересно, есть ли гарантия того, что компилятор будет соблюдать ширину color
. Как обсуждалось в этом вопросе, компилятор может выбрать для представления color_t
в виде символа. В этот момент указанная ширина кажется неверной в соответствии с Спецификация C99:
Выражение, определяющее ширину битового поля, должно быть целочисленным постоянным выражением с неотрицательным значением, которое не превышает ширину объекта того типа, который был бы указан, если бы двоеточие и выражение были опущены.
Как я могу заставить поле color
использовать 10 бит? Обратите внимание, что проблема исчезает, если компилятор использует обычное целое число для представления color_t
, но такое поведение нельзя предполагать.
enum
константы - этоint
,enum
типы не обязательно должны бытьint
. - person ouah   schedule 25.06.2014unsigned int
), поскольку тип членаcolor
был бы более переносимым решением IMHO - person ouah   schedule 25.06.2014int
? - person mafso   schedule 25.06.2014