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

Turn off compiler warning for switch/case statements using enums

本文关键字:语句 case 编译器 警告 switch 枚举      更新时间:2023-10-16

假设您有一个枚举类型,其值有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/elses语句;)

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

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


澄清:我说的是:

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

与此:

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

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