如果带有枚举类型参数的开关错过了某些常量并且没有默认分支,则gcc -Wswitch
选项会发出类似
warning: enumeration value 'WHATEVER' not handled in switch
然而,我们的许多开关都是:
enum foo {
FOO_ONE,
FOO_TWO,
FOO_COUNT
};
其中FOO_COUNT永远不会显示为值,但用于了解已定义且可能出现在变量中的值的数量。因为我们使用枚举值索引数组或对其进行位打包,并且需要检查它是否适合。因此,处理所有值的枚举应不包含此常量。有没有办法保持警告,但避免这种特殊值?即。
switch(foo) {
case FOO_ONE:
anything;
};
应该发出警告,但是:
switch(foo) {
case FOO_ONE:
anything;
case FOO_TWO:
anything_else;
}
不。
答案 0 :(得分:3)
我个人更喜欢另一种方法:通过宏生成enum
来设置计数。
GENERATE_ENUM(foo, (FOO_ONE)(FOO_TWO))
将产生:
enum foo {
FOO_ONE,
FOO_TWO
};
inline size_t size(enum foo) { return 2; }
因此我的枚举是免费的。
宏也可以适用于生成其他有用的值,例如(在不连续的枚举的情况下)所有值的数组(按顺序),这可能对自动迭代或检查存在等有用。
答案 1 :(得分:2)
如果您已经知道哪个switch
处理了所有值,则可以将default:
关键字添加到这些值,但同时它会捕获未列在其中的所有其他值您的switch-case
,即使您忘记了例如case FOO_ONE:
,也不会收到警告。
switch(value){
case FOO_ONE:
break;
default:
break;
}
您还可以将其与宏结合使用,以便您可以从代码的某一点“启用”警告:
#define m_ignore_switch_case_warnings default: break
//and define it like this to enable the warnings again
#define m_ignore_switch_case_warnings
switch(value){
case FOO_ONE:
break;
m_ignore_switch_case_warnings;
}
您可以“禁用”任何类型switch
的警告,如果您更改了枚举switch
或者您已经更新FOO_COUNT
代码,则无需更新{{1}}代码你的计数变量有不同的名称。
另外,您被引用David Rodríguez - dribeas的帖子
答案 2 :(得分:1)
如果你还想对其他人发出警告,我唯一能想到的就是真正创造案例:
switch (foo) {
...
case FOO_COUNT: //empty
}