C 开关情况下的混合枚举
C标准在C 开关情况下的混合枚举,c,enums,klocwork,C,Enums,Klocwork,C标准在开关-case语句的case常量中谈论混合枚举的内容是什么?我确保混合enum类型没有重复的值 switch (value) /* value is int type */ { case enum1_val: /* enum1_val is of enum type enum1 */ break; case enum2_val: /* enum2_val is of enum type enum2 */ break; } 我使用-ansi-Wall标志编译了干净的代码,
开关
-case
语句的case常量中谈论混合枚举的内容是什么?我确保混合enum
类型没有重复的值
switch (value) /* value is int type */
{
case enum1_val: /* enum1_val is of enum type enum1 */
break;
case enum2_val: /* enum2_val is of enum type enum2 */
break;
}
我使用
-ansi-Wall
标志编译了干净的代码,但Klockwork报告了此代码中的一些问题。在C中是允许的。您得到的是Klockwork的警告,因为它认为混合不同的枚举
类型不是一个好主意。(我个人同意这一点):
引述自:
不一致的案例标签
不一致的.LABEL检查器查找将多个枚举类型用作开关表达式或开关语句中的标签的情况
脆弱性和风险
在switch语句中使用具有不同枚举类型的标签可能会导致问题,因为具有相同值的枚举成员可能具有不同的含义。设计意图失败,可能会出现意外结果
这是允许的,但这种枚举有什么意义?因为它是愚蠢的<代码>值应具有正版类型,并且只能具有一种类型。如果您不确定变量的类型,则表明您做错了。show enum definition in question作为此构造用例的示例,case常量是由不同的下层模块(例如消息id)定义的枚举。高层模块使用switch case处理从底层模块发送的消息。我认为这无关紧要,因为它们是编译时常量,并且具有int类型,应该可以。科洛克说什么?enum1_val和enum2_val的值是什么?