首页 > 解决方案 > 为什么作为位域的一部分的枚举值需要从 unsigned char 到枚举类型的(隐式)类型转换?

问题描述

此问题适用于 NXP/飞思卡尔 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 );

标签: c

解决方案


您的编译器是正确的:

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

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

另见

6.7.2.1p10:“位域被解释为具有由指定位数组成的有符号或无符号整数类型。”

使用unsigned char位域是有效的。

一般来说,如果标准类型可用,则使用自制类型定义是不好的做法。C 有一个强制的布尔类型_Bool(分别bool支持常量宏 using stdbool.h),它具有预期的语义(不同于enums)。使用它可以避免这些问题,并且在实现之间也可以移植。

通常,位域struct在 C 中用处不大。没有定义的布局、底层或其他可能预期的保证。大多数时候,固定宽度的整数类型和位操作是更好的选择。有趣的是,_Bool位域是最有保证的类型。所以使用这个标准类型可以避免这个问题。


推荐阅读