【发布时间】:2016-02-08 19:48:48
【问题描述】:
我试图更好地理解 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;
};
我可以使用-std=c99 -Wall -Wextra -pedantic 使用 gcc-5.0 和 clang-3.5 编译它而不会发出警告,但使用 gcc-4.8 我会收到以下警告
warning: type of bit-field 'bitfield' is a GCC extension
从这里开始混乱。枚举作为位域是否被视为 int 或实现定义的类型?这是 GCC-4.8 中的错误还是他们改变了对标准的解释?将它与其他 C99 编译器一起使用是否安全?
【问题讨论】:
-
@Rhymoid 我不确定这是否真的是重复的。 AFAIK 是 unsigned char unsigned int 的子类型,而 enum 可以等效于 int。也可能是我误解了 6.7.2.2 段中的“与 [...] 整数类型兼容”。 4.
-
第一个引号表示它的实现定义了允许将哪些其他类型用作位域
标签: c language-lawyer c99