我想更好地理解C99标准,但现在我很困惑在枚举中使用枚举作为位域,如果它们被视为int或作为实现定义的类型。在C99的最终草案中查找时,我发现6.7.2.1段。 4枚举为位域实现定义类型吗?
位字段应具有一种类型,是_Bool的合格或不合格的版本,符号int,无符号整型,或其他一些实现定义类型。
和6.7.2.2段。 4
每个枚举类型应与炭,有符号整数类型,或一个无符号整数类型兼容。类型的选择是实现定义的,但应能够表示枚举的所有成员的值。 ...
所以我用这个简单的源代码试图
enum e {
E0, E1
};
struct s {
enum e bitfield : 4;
};
我可以用gcc-5.0编译这个没有警告和使用-std=c99 -Wall -Wextra -pedantic
铛-3.5,但我得到的gcc-4.8以下警告
warning: type of bit-field 'bitfield' is a GCC extension
在这里开始混乱。枚举作为位域被视为int还是实现定义的类型?这是GCC-4.8中的一个错误还是他们改变了对标准的解释?和其他C99编译器一起使用它是否安全?
可能重复[使用位域与无符号字符时警告](http://stackoverflow.com/questions/10906238/warning-when-using-bitfield-with-unsigned-char) – 2015-11-07 21:07:23
@Rhymoid我不确定如果这真的是重复的。 AFAIK是无符号字符unsigned int的子类型,而枚举可以等同于int。它也可能是我误解了6.7.2.2段中的“与整数类型兼容”。 4. – fsasm
第一个引用意味着它是实现定义哪些其他类型允许用作位域 –