1

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

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

正如您所看到的,虽然它们在更大的图景方面是相关的,但它们的使用上下文并不相互关联。

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

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

我经常使用 if/else 来适应这一点,但是当检查不止一个条目的枚举值时(这真的很罕见,因为枚举的目的通常需要条件逻辑来补充它),我一直是倾向于使用 switch/case,因为我觉得它更美观(即使它只是编译成 if/else 语句;))

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

4

1 回答 1

10

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


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

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

与这个:

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

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

于 2012-10-15T00:18:16.527 回答