严格的ANSI C-8位结构元素有冲突吗?

严格的ANSI C-8位结构元素有冲突吗?,c,C,我定义了一个结构,如下所示: struct Display7 { U8 a : 1; U8 b : 1; U8 c : 1; U8 d : 1; U8 e : 1; U8 f : 1; U8 g : 1; }Display7; 如果在KeilIDE中禁用严格的ANSIC检查,则不会出现错误。 如果启用严格的ANSI C,我会得到错误“位字段的非标准类型”。 是什么导致了问题? 如果我将每个struct元素设置为U32,那么ansic不会抱

我定义了一个结构,如下所示:

struct Display7
{
    U8 a : 1;
    U8 b : 1;
    U8 c : 1;
    U8 d : 1;
    U8 e : 1;
    U8 f : 1;
    U8 g : 1;
}Display7;
如果在KeilIDE中禁用严格的ANSIC检查,则不会出现错误。 如果启用严格的ANSI C,我会得到错误“位字段的非标准类型”。 是什么导致了问题?
如果我将每个struct元素设置为U32,那么ansic不会抱怨

标准对此很清楚:

6.7.2.1结构和联合说明符:5/位字段的类型应为合格或不合格
\u Bool
有符号整数
无符号整数
或其他版本 实现定义的类型。它是由实现定义的 允许使用原子类型


C99中可选择类型不同于有符号或无符号的
int
\u Bool
的位字段。

U8的确切定义是什么?为什么不使用uint8\u t?@AnttiHaapala;事实上,甚至
\u Bool
需要8位。@haccks-至少8位。:)它可能更大。我最初以为我知道编译器大于8位,但找不到。编译器试图告诉你,一般使用位字段是个坏主意。特别是如果需要标准遵从性和可移植性。哈哈,我们同时回答。两个答案我都喜欢。你的很精确,我想我的很简洁。投票表决所以不允许使用一种无符号字符,无符号短int?只允许使用无符号int/有符号int/\u Bool?就是这样。您可以确保能够使用这些类型,任何其他类型都可能被禁止。哈哈,这是递归的:)