假设您有一个枚举类型,其值为50多个条目。曾经有一段时间我用这个数量的条目切换/设置枚举值,但只是为了检查,比如说,从中检查2到5个条目。
例如,OpenGL将其大部分枚举粘贴在一个枚举类型中,称为GLenum
。这些值的范围从GL_VERTEX_SHADER
到GL_STREAM_DRAW
到GL_TRIANGLES
到GL_ARRAY_BUFFER
等。
正如您所看到的,虽然这些与更大的图景有关,但它们的使用环境并不相互关联。
我在Linux中的MinGW / GCC上生成了警告,其中每个警告都记录了其类型声明中列出的每个枚举值。我不确定VC ++上是否会发生这种情况,但我认为无论如何我都会考虑它以防万一。
换句话说,对于每个枚举值,生成的警告数量为TotalEnumValues - AmountOfCaseStatements
,前提是并非所有枚举都已在语句本身中计算, 可轻松导致100+如果您的枚举类型包含至少100个条目,则编译器警告。
我经常使用if / else来容纳这个,但是当检查枚举值不仅仅是一个条目时(这实际上非常罕见,因为枚举的目的通常需要条件逻辑为了恭维它,我总是倾向于使用switch / case,因为我发现它更美观(即使它只是编译成if / else语句;)
那么,这个警告是否可以关闭?如果是这样,怎么样?
答案 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)可能的情况