使用无符号字符位域时出现警告

7

这是我的位域

struct {
    unsigned char v64 : 1;
    unsigned char leg : 7;
} valid;

然后我收到了警告:
main.c:17:3: warning: type of bit-field ‘v64’ is a GCC extension [-pedantic]
main.c:18:3: warning: type of bit-field ‘leg’ is a GCC extension [-pedantic]

如果我改成int是不会有警告的。但我想要一个位域来存储一个字节(无符号字符)。
怎么做?

1
int 在位域中有特殊的含义。sizeof(struct valid) 是多少? - Pubby
@Pubby:使用int,= 4; unsigned char = 1。 - Fabricio
这是一个非常常见的编译器扩展。也许你应该忽略警告,想要你的蛋糕并吃掉它。 - Hans Passant
1个回答

14

如果不想得到警告,请删除gcc-pedantic选项。

在C99中,使用-pedantic时,gcc会发出警告,但是可以为位域(例如unsigned char)定义实现定义类型。

(C99, 6.7.2.1p4) "位域的类型必须是_ Bool、signed int、unsigned int或其他实现定义的类型的限定或非限定版本之一。"

在C90中,只允许使用intunsigned intsigned int

(C90, 6.5.2.1) "位域的类型必须是int、unsigned int或signed int之一的限定或非限定版本。"

实际上,在C90和C99中,该警告都不是C所要求的(仅在C90中为未定义行为,但C不要求对未定义行为发出警告)。该警告仅由gcc-pedantic一起添加以提供信息。


在C90中,是否也允许使用“unsigned long int”? - avivgood2
“在C90中,只允许使用int、unsigned int和signed int。”因此,不允许使用unsigned long int - ouah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接