15

我最近升级到了新的编译器 Clang LLVM 4.0,它很好。只是在这种情况下,它向我显示了一些旧代码的丑陋警告:

警告:case value not in enumerated type 'SomeConstants' (aka '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
    ...

我想知道是否有更优雅的方法来解决这个问题。

4

1 回答 1

34

您可以将switch()语句的表达式转换为int,使其不/不能执行该检查。

毕竟,它实际上是用来保存一个int值,而不是列出的枚举数之一。

于 2012-06-18T04:37:46.583 回答