C语言'enumerated type mixed with another type'警告问题咨询
警告触发原因
你设置枚举首元素为0u只是指定了枚举成员的取值为无符号,并不会让枚举类型本身和unsigned int等价,警告的根本原因是C语言的静态类型检查规则:
- C标准没有限定枚举类型的底层整数类型必须为
unsigned int,编译器会根据枚举成员的取值范围自动选择足够容纳所有值的最小类型。你定义的employid只有3个取值,大部分编译器会默认选择unsigned char、signed char或者short作为底层类型,本身和32位的unsigned int属于完全不同的整数类型,跨类型赋值自然会触发警告。 - 哪怕部分场景下编译器给枚举分配的底层类型和
unsigned int一致,枚举本身也是独立的自定义类型,C的类型检查规则本身就不允许直接将unsigned int类型的值赋值给枚举变量、或者作为枚举类型形参的实参,这个检查是为了提前拦截超出枚举合法取值范围的非法值,减少运行时问题。
解决方案
如果你确认当前var的取值一定在employid的合法取值范围内,只需增加显式强制类型转换即可消除警告:
- 修复赋值警告:
s.e = (employid)var;
- 修复传参警告:
// 注:你给出的函数定义参数类型写为employ,应为employid笔误 somefun((employid)var);
内容的提问来源于stack exchange,提问作者Anirudh _k
相关产品推荐
相关产品推荐

