Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是",;位字段类型太小,无法容纳位数“;C+的错误部分+;标准_C++_Language Lawyer_Bit Fields - Fatal编程技术网

C++ 是",;位字段类型太小,无法容纳位数“;C+的错误部分+;标准

C++ 是",;位字段类型太小,无法容纳位数“;C+的错误部分+;标准,c++,language-lawyer,bit-fields,C++,Language Lawyer,Bit Fields,以下代码在Visual Studio 2008中生成: struct TestStruct { unsigned short var1 : 7; unsigned short : 9; bool var2 : 1; bool : 15; // C2034 }; 但是,这两个代码段都在我的Linux GCC编译器上编译。根据C++标准,编译器是否比其他编译器更正确?如果是,原因是什么?是的,这是MSV中的

以下代码在Visual Studio 2008中生成:

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

但是,这两个代码段都在我的Linux GCC编译器上编译。根据C++标准,编译器是否比其他编译器更正确?如果是,原因是什么?

是的,这是MSV中的一个错误。该标准在[class.bit]/1中说明

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


因此,编译器应该添加额外的填充,只允许您有一个等于
CHAR\u BIT*sizeof(BIT\u field\u underlined\u type)

的位数。通常,MSV几乎总是错误的。Clang3.4.1也成功地编译了它。为什么你希望编译器在背后默默地为你重写代码?您明确要求输入类型为
bool
的15位字段,这是不可能的。它怎么知道您实际上想要一个类型为
bool
的8位字段,而不是创建一个类型为
long
的15位字段,或者其他什么?(GCC和ICC对此发出警告。如果我知道正确的开关,Clang也可能会这样做。那么你的问题是,为什么MSVC会将此视为错误?@CodyGray如果不可能,为什么Linux上的GCC会让我这样做?类型应该不重要,它们只是对齐块,不是吗?@Rakete1111除了在这种情况下g++也会抱怨。(这是一个警告,但仍然)如果允许编译器做出假设,这当然不是不可能的。很少有事情是这样的。但是,让编译器重新解释您在背后编写的代码违反了最不令人惊讶的原则。我不会把这称为bug。MSV显然不符合标准,但错误消息显然是要生成的。所以“非标准行为”可能是一个更好的描述。@lcs我想说,不符合标准是一个错误。@SebastianLenartowicz它确实抓住了gcc和clang没有抓住的地方;)@lcs:实际上,不符合项是一个缺陷。在
/Ze
模式下,这只是一种故意的偏差。 error C2034: 'TestStruct::<alignment member>': type of bit field too small for number of bits
struct TestStruct {
    unsigned short var1 : 7;
    unsigned short      : 9;
    bool var2           : 1;
    bool                : 7;
    bool                : 8;
};