【问题标题】:Turn off compiler warning for switch/case statements using enums使用枚举关闭 switch/case 语句的编译器警告
【发布时间】:2012-10-15 00:13:14
【问题描述】:

假设您有一个枚举类型,其值包含 50 多个条目。以前我曾多次使用此数量的条目切换/设置枚举值,但只是为了检查其中的 2 到 5 个条目。

例如,OpenGL 将其大部分枚举都固定在一种枚举类型中,称为GLenum。这些值的范围从GL_VERTEX_SHADERGL_STREAM_DRAWGL_TRIANGLESGL_ARRAY_BUFFER 等。

如您所见,虽然它们在更大的图景上是相关的,但它们的使用环境并不相互关联。

我在 Linux 中的 MinGW/GCC 上生成了警告,其中每个警告说明了其类型声明中列出的 每个 枚举值。我不确定这是否发生在 VC++ 上,但我想我还是会考虑它以防万一。

换句话说,每个枚举值生成的警告数量为TotalEnumValues - AmountOfCaseStatements,前提是语句本身并未考虑所有枚举,这可能很容易导致 100 多个编译器警告如果您的枚举类型包含至少 100 个条目。

我经常使用 if/else 来适应这种情况,但是在检查枚举值时不仅仅是 one 条目(这确实很少见,因为枚举的目的通常需要条件逻辑赞美它),我一直倾向于使用 switch/case,因为我发现它更美观(即使它只是编译成 if/else 语句;))

那么,这个警告可以关闭吗?如果是这样,怎么做?

【问题讨论】:

    标签: c++ c visual-c++ compiler-warnings enumeration


    【解决方案1】:

    添加一个不执行任何操作的default: 案例。编译器将看到您正在“处理”所有可能性(从而消除警告),但如果您不为其指定任何操作,它根本不会改变生成的代码。


    澄清一下:我说的是这个:

    switch(a)
    {
    case CONSTANT_1:
            ...
        break;
    case CONSTANT_2:
            ...
        break;
    }
    

    对比这个:

    switch(a)
    {
    case CONSTANT_1:
            ...
        break;
    case CONSTANT_2:
            ...
        break;
    default:
    }
    

    第二个不修改根本行为,所以编译器不应该改变生成的代码,但会告诉它你没有忘记其他(im)可能的情况.

    【讨论】:

    • 至少在 VC++ 中,添加一个空的 default 大小写可能会影响代码生成,但它具有 __assume 内在函数只是为了这个目的。
    • @ildjarn 编译器总是有可能做一些完全没有意义和愚蠢的事情,但是仅仅破坏的默认值在语义上等同于默认值不存在...... __assume 在这种情况下是无用的。跨度>
    • @JimBalter:您对__assume 的看法不符合逻辑前提。它实际上在这里很有用;它告诉编译器该变量不能具有除switch 语句中的值之外的值。这对于现代优化器来说是非常有用的信息。
    • @MSalters 是的,这对编译器来说是非常有用的信息,但它不是这里所说的——一个什么都不做的默认情况,而不是 不可能发生,所以逻辑故障都是你的。我给 Matteo 一个 +1 正确处理 - “如果你不指定任何操作,它根本不会改变生成的代码”。如果 OP 由于优化而想要不确定的行为,以防发生未在 switch 中指定的值,则 OP 应该这么说。
    • @JimBalter:你可能不熟悉 GL。这里的default 案例是在预期GL_TRIANGLES 时覆盖GL_STREAM_DRAW 枚举。那是一个不可能发生
    猜你喜欢
    • 2012-04-30
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多