我最近升级到了新的编译器 Clang LLVM 4.0,它很不错。只是在这种情况下,它向我展示了一些旧遗留代码的丑陋警告:
警告:case 值不在枚举类型“SomeConstants”(又名“enum SomeConstants”)中 [-Wswitch]
switch (var) {
case kConstant: case 3: case 4: case 8: case 35: //WARNING HERE :(
// do my thing here
break;
case kOtherConstant:
// do another thing here
break;
default:
break;
}
var
可以是枚举中定义的值之一
像这样:
typedef enum SomeConstants {
kConstant,
kOtherConstant,
};
如您所见,2、4、8、35 未定义(这就是编译器编译的原因),但实际上它们发生了(这是我正在使用的这个闭源库的模糊部分之一)。
有没有一种方法可以修改我的开关代码,这样我就不会收到无害但烦人的警告?现在我正在使用以下方法使其静音:
switch (var) {
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wswitch"
case kConstant: case 3: case 4: case 8: case 35:
#pragma GCC diagnostic pop
...
我想知道是否有更优雅的方法来解决这个问题。
最佳答案
您可以将 switch()
语句的表达式转换为 int
,这样它就不会/不能执行该检查。
毕竟,它实际上用于保存 int
值,而不是列出的枚举数之一。
关于c - 警告 : case not evaluated in enumerated type?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11076941/