C 警告:枚举类型与另一种类型混合

C warning : enumerated type mixed with another type

提问人:Anirudh _k 提问时间:11/12/2021 最后编辑:NimanthaAnirudh _k 更新时间:3/30/2022 访问量:1659

问:

我有一个这样的枚举定义 -

typedef enum 
{
    emp1 = 0u,
    emp2,
    emp3
}employid;

C 会向我抛出以下操作的警告

问题 1:

unsigned int var; // 32 bit in my compiler

typedef struct
{
   employid e;
}mystruct;

mystruct s;
s.e = var; // **getting warning enumerated type mixed with another type**

问题 2:

somefun(var); // **getting warning enumerated type mixed with another type**

function definition is somefun(employ e);

我不明白,即使我的枚举值是正的,因为第一个元素是 0u,为什么 C 编译器对我大喊大叫将其分配给无符号 int?

c GCC 警告 Coverity

评论

0赞 zoomlogo 11/12/2021
由于您已将 e 定义为雇佣,因此无法将其分配给无符号的 int
0赞 Retired Ninja 11/12/2021
无论哪种情况,都不能保证是枚举值之一。var
0赞 Anirudh _k 11/12/2021
@RetiredNinja这是真的,我们能做些什么来抑制警告呢?我不想添加范围检查
0赞 Anirudh _k 11/12/2021
@RetiredNinja有什么帮助吗?
0赞 Retired Ninja 11/12/2021
投射它可能有助于发出警告。不过,它不会使使用无效值变得更好。

答:

1赞 Lundin 11/12/2021 #1

就 C 语言规则而言,您的代码很好。这些只是额外的诊断,告诉您代码是可疑的。

可能保存的值与任何有效的枚举常量都不匹配,在这种情况下,您最终将保留一个无效的值。也就是说:大多数时候,将纯整数与枚举混合没有任何意义。如果您发现自己这样做,那么根本问题可能出在程序设计级别。unsigned ints.e

如果您确定它持有 ok 值,您可以进行显式强制转换。但更有可能的是,应该首先宣布。vars.e = (employid)var;varemployid

评论

0赞 Anirudh _k 11/15/2021
嗨,所以问题来了,因为我存储了我的变量,它是枚举的一部分,并在多个函数调用之间传递它。因此,s.e=var 给出错误,尽管它从传递的地方传递的函数已将其声明为枚举的一部分。奇怪