除int之外的其他类型的位域?

我有一个代码,它使用如下声明的位字段

typedef struct my{ const char *name; uint8_t is_alpha : 1; uint8_t is_hwaccel : 1; uint8_t x_chroma_shift; uint8_t y_chroma_shift; } mystr; 

uint8_t是对unsigned char typedef。

使用此位字段在MS-VS 2008中构建代码会发出如下警告:

  imgconvert.c(60):警告C4214:使用非标准扩展:除int之外的位字段类型。 
  1. 使用除int之外的类型的位字段是否存在任何问题/潜在问题? 警告为什么?
  2. C99 C语言规范允许的是int类型的bit-fileds以外的吗?

1]使用除int之外的类型的位字段是否存在任何问题/潜在问题? 警告为什么?

由于位字段是低级别的,因此如果使用非标准类型,则可能存在可移植性问题。 因此警告 – 注意它仍然是警告而不是错误。

2] C99 C语言规范是否允许使用int类型的bit-fileds?

从C99草案:

6.7.2.1结构和联合说明符

4位字段的类型应为_Bool,signed int,unsigned int或其他实现定义类型的限定或非限定版本。

为什么不使用int ? 位域的实际实现因编译器而异。 如果要编写可移植代码,请使用int 。 如果要创建小型结构或固定字节数的结构,或者位是固定位置的结构,请不要使用位域。 创建一个名为flagsuint8_t成员,并定义用作位掩码的宏。