"位字段类型对于位数来说太小"错误是否属于C++标准?

Is the "Type of bit field too small for number of bits" error part of the C++ standard?

本文关键字:是否 错误 属于 C++ 标准 字段 类型 于位数      更新时间:2023-10-16

以下代码在Visual Studio 2008中生成MSVS编译错误C2034:

struct TestStruct {
    unsigned short var1 : 7;
    unsigned short      : 9;
    bool var2           : 1;
    bool                : 15; // C2034
};
错误C2034: 'TestStruct::struct TestStruct {
    unsigned short var1 : 7;
    unsigned short      : 9;
    bool var2           : 1;
    bool                : 7;
    bool                : 8;
};

但是,这两个代码片段都可以在我的Linux GCC编译器上编译。根据c++标准,一个编译器比另一个更正确吗?如果是,是哪一种,为什么?

是的,这是MSVS中的一个bug。标准状态在[class.bit]/1

[…整型常量表达式的值可能大于位字段类型的对象表示(3.9)中的位数;在这种情况下,额外的位被用作填充位,而不参与位域的值表示(3.9)。[…]

所以编译器应该添加额外的填充,只让你有等于CHAR_BIT * sizeof(bit_field_underlying_type)的位数