【问题标题】:warning when using bitfield with unsigned char使用带有 unsigned char 的位域时发出警告
【发布时间】:2012-06-05 23:08:20
【问题描述】:

这是我的位域

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,则没有警告。但我想要一个字节的位域(无符号字符)。

怎么做?

【问题讨论】:

  • int 在位域内部具有特殊含义。 sizeof(struct valid) 是什么?
  • @Pubby: 使用 int, = 4;无符号字符 = 1。
  • 这是一个非常常见的编译器扩展。也许你应该忽略警告,吃掉你的蛋糕。

标签: c


【解决方案1】:

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

在 C99 中,gcc 发出带有 -pedantic 的警告,但允许为位域使用实现定义的类型(如 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 是不允许的。
猜你喜欢
  • 1970-01-01
  • 2017-03-13
  • 1970-01-01
  • 2017-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-15
相关资源
最近更新 更多