zeb*_*und 0 c c++ enumeration compiler-warnings visual-c++
假设您有一个枚举类型,其值为50多个条目.曾经有一段时间我曾用这个数量的条目切换/设置枚举值,但仅用于检查,例如,从中检查2到5个条目.
例如,OpenGL将其大多数枚举粘贴在一个枚举类型中,称为GLenum.这些值的范围从GL_VERTEX_SHADERto GL_STREAM_DRAW到GL_TRIANGLESto GL_ARRAY_BUFFER等.
正如您所看到的,虽然这些与更大的图景有关,但它们的使用环境并不相互关联.
我在Linux中的MinGW/GCC上生成了警告,其中每个警告都记录了其类型声明中列出的每个枚举值.我不确定VC++上是否会发生这种情况,但我认为无论如何我都会考虑它以防万一.
换句话说,生成的警告数量是TotalEnumValues - AmountOfCaseStatements针对每个枚举值,前提是并非所有枚举都已在语句本身中进行了说明,如果您的枚举类型包含至少100个条目,则很容易导致100多个编译器警告.
我经常使用if/else来容纳这个,但是当检查枚举值超过一个条目时(这实际上非常罕见,因为枚举的目的通常需要条件逻辑来补充它),我一直都是容易使用开关/外壳,因为我发现它更美观(即使它只是编译成if/else语句,无论如何;))
那么,这个警告是否可以关闭?如果是这样,怎么样?
添加一个default:什么都不做的案例.编译器将看到您正在"处理"所有可能性(从而删除警告),但如果您没有为其指定任何操作,它将不会更改所有生成的代码.
澄清:我在说这个:
switch(a)
{
case CONSTANT_1:
...
break;
case CONSTANT_2:
...
break;
}
Run Code Online (Sandbox Code Playgroud)
对此:
switch(a)
{
case CONSTANT_1:
...
break;
case CONSTANT_2:
...
break;
default:
}
Run Code Online (Sandbox Code Playgroud)
第二个不会修改所有行为,因此编译器不应该更改生成的代码,但会告诉它你没有忘记其他(im)可能的情况.