c - 为什么作为位域的一部分的枚举值需要从 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 标准,6.7.2.2p4:“每个枚举类型应与 char、有符号整数类型或无符号整数类型兼容。类型的选择是实现定义的,但应能够表示所有成员的值的枚举。”
您的实现似乎使用了一些内部类型来表示枚举类型,这是有效的。
另见
6.7.2.1p10:“位域被解释为具有由指定位数组成的有符号或无符号整数类型。”
使用unsigned char
位域是有效的。
一般来说,如果标准类型可用,则使用自制类型定义是不好的做法。C 有一个强制的布尔类型_Bool
(分别bool
支持常量宏 using stdbool.h
),它具有预期的语义(不同于enum
s)。使用它可以避免这些问题,并且在实现之间也可以移植。
通常,位域struct
在 C 中用处不大。没有定义的布局、底层或其他可能预期的保证。大多数时候,固定宽度的整数类型和位操作是更好的选择。有趣的是,_Bool
位域是最有保证的类型。所以使用这个标准类型可以避免这个问题。
推荐阅读
- html - CSS调整按钮大小
- python - How to store 128-d facial encodings in a numpy multidimensional array?
- node.js - 在节点中使用猫鼬实例
- python - 在 python 中为给定的 YouTube 链接创建意图协议链接
- rust - 还有理由使用lazy_static吗?
- reactjs - React Native 密码锁屏创建。使用状态错误
- python - 自定义印度键盘音译:如何
- svg - 如何在刻度线下方正确对齐刻度值/标签
- angular - 如何为内部元素禁用 routerLink
- asp.net-core - HTTP 错误 502.5 - 进程失败 asp .net core 5