为什么作为位字段一部分的枚举值需要从无符号字符到枚举类型的(隐式)类型转换?

时间:2018-07-31 18:41:53

标签: c

该问题适用于NXP / FreeScale CodeWarrior MCU 10.5。 为什么以下代码提取导致最后一行出现警告illegal implicit conversion from 'unsigned char' to >'const @enum$1cb_c'

typedef enum { BOOL__FALSE, BOOL__TRUE } Bool_t;

typedef struct a { Bool_t b : 1; } a_t;

void d (Bool_t e);

a_t c = { BOOL__FALSE };

d ( c.b );

1 个答案:

答案 0 :(得分:-6)

您的编译器是正确的:

  

C标准6.7.2.2p4:“每种枚举类型都应与char,有符号整数类型或无符号整数类型兼容。类型的选择是实现定义的,但应能够表示枚举的所有成员。”

您的实现似乎使用某种内部类型来表示枚举类型,这是有效的。

也可以看到

  

6.7.2.1p10:“位字段被解释为具有指定位数的带符号或无符号整数类型。”

对于位字段使用unsigned char是有效的。

通常,如果标准类型可用,则使用自制字体typedef是不好的做法。 C具有强制布尔类型_Bool(分别为boolstdbool.h支持常量宏),具有预期的语义(不同于enum s)。使用它可以避免这些问题,并且可以在实现之间移植。

通常,位字段struct在C中用处很小。可能没有预期的定义的布局,基础或其他保证。通常,固定宽度的整数类型和位运算是更好的选择。有趣的是,_Bool位字段是最有保证的类型。因此,使用这种标准类型可以避免此问题。