我试图更好地理解 C99 标准,但现在我对将枚举用作结构中的位域以及它们是否被视为 int 或实现定义的类型感到困惑。在查找 C99 的最终草案时,我发现第 6.7.2.1 段。4
位域的类型应为_Bool、signed int、unsigned int或其他一些实现定义类型的限定或非限定版本 。
和 6.7.2.2 段。4
每个枚举类型应与char、有符号整数类型或无符号整数类型兼容。类型的选择是实现定义的,但应能够表示枚举的所有成员的值。...
所以我尝试使用这个简单的源代码
enum e {
E0, E1
};
struct s {
enum e bitfield : 4;
};
Run Code Online (Sandbox Code Playgroud)
我可以使用 gcc-5.0 和 clang-3.5 在没有警告的情况下编译它,-std=c99 -Wall -Wextra -pedantic但是我在 gcc-4.8 中得到以下警告
warning: type of bit-field 'bitfield' is a GCC extension
Run Code Online (Sandbox Code Playgroud)
这里开始混乱。枚举作为位域是否被视为 int 或实现定义的类型?这是 GCC-4.8 中的错误还是他们改变了对标准的解释?将它与其他 C99 编译器一起使用是否安全?