【发布时间】:2014-08-15 08:27:50
【问题描述】:
我有一个打算使用 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 位,尽管将来我们可能会添加更多值(因此我们为 color 保留了 10 位)
在 C99 中,我想知道是否有任何保证 color 的宽度会被编译器尊重。正如this question 中所讨论的,编译器可能会选择将color_t 表示为一个字符。此时,根据C99 spec,指定的宽度出现错误:
指定位域宽度的表达式应该是一个整数常量表达式,其非负值不超过在省略冒号和表达式的情况下指定类型的对象的宽度。
那么,我怎样才能强制 color 字段使用 10 位呢?请注意,如果编译器使用常规整数来表示 color_t,问题就会消失,但不能假设这种行为。
【问题讨论】:
-
编译器可能会选择将 color_t 值表示为字符这听起来不对。
-
@this 你能详细说明一下吗?
-
@ouah 枚举是一个整数。
-
@this 当然不是,
enum常量是int,enum类型不需要是int。 -
@user3120046 使用非枚举类型(例如,
unsigned int)作为color成员的类型将是更便携的解决方案恕我直言
标签: c struct enums c99 bit-fields