c - 警告 : case not evaluated in enumerated type?

标签 c gcc clang

我最近升级到了新的编译器 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/

相关文章:

c - C中的类型转换混淆

c - 这个哈希函数是如何工作的?这些数字是随机的吗?

r - gcc:错误:libgomp.spec:Amazon Linux 2017.09.1 没有此类文件或目录

c++ - 关于隐藏成员变量的警告?

c++ - 从 C 程序调用的 C++ 库中的新建和删除

r - loop_apply.o : file not recognized: File format not recognized

c - 更好的链表编程实践

c - OpenMP 自定义调度

c++11 - Clang 3.5和3.6之间的过载分辨率更改是否正确还是错误?

macos - 如何在我的新 MacBook Pro(使用 Mac OS Catalina)上安装 openMP?