使用枚举关闭switch / case语句的编译器警告

时间:2012-10-15 00:13:15

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

假设您有一个枚举类型,其值为50多个条目。曾经有一段时间我用这个数量的条目切换/设置枚举值,但只是为了检查,比如说,从中检查2到5个条目。

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

正如您所看到的,虽然这些与更大的图景有关,但它们的使用环境并不相互关联。

我在Linux中的MinGW / GCC上生成了警告,其中每个警告都记录了其类型声明中列出的每个枚举值。我不确定VC ++上是否会发生这种情况,但我认为无论如何我都会考虑它以防万一。

换句话说,对于每个枚举值,生成的警告数量为TotalEnumValues - AmountOfCaseStatements,前提是并非所有枚举都已在语句本身中计算, 可轻松导致100+如果您的枚举类型包含至少100个条目,则编译器警告。

我经常使用if / else来容纳这个,但是当检查枚举值不仅仅是一个条目时(这实际上非常罕见,因为枚举的目的通常需要条件逻辑为了恭维它,我总是倾向于使用switch / case,因为我发现它更美观(即使它只是编译成if / else语句;)

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

1 个答案:

答案 0 :(得分:9)

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


澄清:我在谈论这个:

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

vs this:

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

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