【发布时间】:2016-09-09 15:59:30
【问题描述】:
以下代码在 Visual Studio 2008 中生成 MSVS Compiler Error 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;
};
但是,两个代码 sn-ps 都在我的 Linux GCC 编译器上编译。根据 C++ 标准,一个编译器是否比另一个更正确?如果有,是哪一个,为什么?
【问题讨论】:
-
通常情况下,MSVS 几乎总是错误的。 Clang 3.4.1 也编译成功了。
-
您为什么希望编译器在您背后默默地为您重写代码?您明确要求
bool类型的 15 位字段,这是不可能的。它应该如何知道您实际上想要一个bool类型的 8 位字段,而不是创建一个long类型的 15 位字段或其他? (GCC 和 ICC 对此发出警告。如果我知道正确的开关,Clang 也可能会这样做。你的问题就是,为什么 MSVC 将其视为 错误?) -
@CodyGray 如果不可能,为什么 Linux 上的 GCC 让我这样做?而且类型不重要,它们只是对齐部分,不是吗?
-
@Rakete1111 除了在这种情况下 g++ 也会抱怨。 coliru.stacked-crooked.com/a/c95cb2b1e77dbdb5(这是一个警告,但仍然)
-
如果允许编译器做出假设,这当然不是不可能。很少有。但是,让编译器重新解释您在背后编写的代码,这违反了最小意外原则。
标签: c++ language-lawyer bit-fields