C语言枚举类型与uint8_t混用警告(#188-D)原因咨询
枚举类型与其他类型混合触发#188-D警告的原因?
我写了这段代码:
static enum { TYPE = 'T', [...] } stage = TYPE; // 默认初始化为TYPE
然后声明并定义了函数:
void type_init(uint16_t position, uint8_t stage_state); void type_init(uint16_t position, uint8_t stage_state){ stage = stage_state; }
此时编译器抛出警告 #188-D: enumerated type mixed with another type,想请教这个警告产生的原因是什么?
警告产生的核心原因
虽然在C语言中,枚举类型的底层实现是整数,但编译器会把它当作一种独立的自定义类型来处理,目的是约束变量只能取枚举中定义的合法值(比如你的例子里是TYPE以及[...]里的其他枚举值)。
而你的代码里:
stage是枚举类型变量,它的合法取值范围被限定在你定义的枚举常量集合内stage_state是uint8_t类型的普通整数,它的取值范围是0-255,远大于枚举的合法值集合
直接把普通整数赋值给枚举变量,编译器会认为这是一种类型不匹配的隐式转换,可能存在风险——比如stage_state的值不在枚举的合法范围内,会导致stage变成一个枚举定义之外的“非法”值,破坏枚举类型的语义约束,所以抛出#188-D警告来提醒你。
如何解决这个警告
如果你确定stage_state的取值一定在枚举的合法范围内,可以显式强制转换来消除警告:
stage = (typeof(stage))stage_state;
或者更稳妥的方式,把函数参数的类型改成对应的枚举类型,从根源上避免类型不匹配:
// 先给枚举类型起个名字 typedef enum { TYPE = 'T', [...] } StageType; static StageType stage = TYPE; // 函数参数改为枚举类型 void type_init(uint16_t position, StageType stage_state){ stage = stage_state; }
内容的提问来源于stack exchange,提问作者user5713188
相关产品推荐
相关产品推荐

