...实际类型在 C11 中有所不同_Generic
1 编译器如何处理位字段类型的结果如下所示。
8 位和 32 位字段与通常的嫌疑人匹配。
1 位位域的类型是什么?正如其他人所引用的那样,它的“名称”没有明确指定,但它不是任何预期的标准类型。
这没有引用规范,但确实展示了受人尊敬的编译器如何解释 C 规范。
GNU C11 (GCC) 版本 5.3.0 (i686-pc-cygwin)
由 GNU C 版本 5.3.0、GMP 版本 6.1.0、MPFR 版本 3.1.4、MPC 版本 1.0.3 编译
#define info_typename(X) _Generic((X), \
_Bool: "_Bool", \
unsigned char: "unsigned char", \
signed char: "signed char", \
char: "char", \
int: "int", \
unsigned : "unsigned", \
default: "default" \
)
#define TYPE_NAME(t) { printf("%s\n", info_typename(t)); }
#include <stdio.h>
int main() {
struct {
signed int x1 :1;
signed int x8 :8;
signed int x32 :32;
_Bool b;
signed char sc;
char c;
unsigned char uc;
int i;
unsigned u;
} foo;
TYPE_NAME(foo.b);
TYPE_NAME(foo.sc);
TYPE_NAME(foo.c);
TYPE_NAME(foo.uc);
TYPE_NAME(foo.i);
TYPE_NAME(foo.u);
TYPE_NAME(foo.x1);
TYPE_NAME(foo.x8);
TYPE_NAME(foo.x32);
}
输出
_Bool
signed char
char
unsigned char
int
unsigned
default (int:1)
signed char (int:8)
int (int:32)
请注意-Wconversion
下面的代码,我收到此警告。所以这至少是一个编译器称之为它的小位字段类型:unsigned char:3
.
警告:从 'unsigned int' 转换为 'unsigned char:3' 可能会改变其值 [-Wconversion]
struct {
unsigned int x3 :3;
} foo;
unsigned u = 1;
foo.x3 = u; // warning