6

如果带有枚举类型参数的开关错过了一些常量并且没有默认分支,则 gcc-Wswitch选项会导致类似的警告

warning: enumeration value 'WHATEVER' not handled in switch

但是,我们的许多开关是这样的:

enum foo {
    FOO_ONE,
    FOO_TWO,
    FOO_COUNT
};

其中 FOO_COUNT 永远不会作为值出现,而是用于了解已定义并可能出现在变量中的值的数量。因为我们正在使用枚举值索引一个数组或对其进行位打包,并且需要检查它是否适合或其他东西。因此,处理所有值的枚举不应包含这个常量。有没有办法保留该警告,但避免使用这种特殊值?IE

switch(foo) {
    case FOO_ONE:
        anything;
};

应该发出警告,但是:

switch(foo) {
    case FOO_ONE:
        anything;
    case FOO_TWO:
        anything_else;
}

应该。

4

3 回答 3

3

我个人更喜欢另一种方法:enum通过宏生成来设置计数。

GENERATE_ENUM(foo, (FOO_ONE)(FOO_TWO))

将产生:

enum foo {
    FOO_ONE,
    FOO_TWO
};

inline size_t size(enum foo) { return 2; }

因此我的枚举是免费的。

该宏还可以适应产生其他有用的值,例如(在不连续枚举的情况下)所有值的数组(按顺序),这可能对自动迭代或检查存在等有用......

于 2012-08-24T14:36:30.743 回答
2

如果您已经知道哪个switchs 处理所有值,则可以将default:关键字添加到这些值,但同时它会捕获未在您的 s 中列出的所有其他值switch-case,因此即使您忘记了也不会收到警告例子case FOO_ONE:

switch(value){
    case FOO_ONE:
        break;
    default:
        break;
}

您还可以将其与宏结合使用,以便您可以从代码的某一点“启用”警告:

#define m_ignore_switch_case_warnings default: break
//and define it like this to enable the warnings again
#define m_ignore_switch_case_warnings

switch(value){
    case FOO_ONE:
        break;

    m_ignore_switch_case_warnings;
}

您将能够“禁用”任何类型的警告,并且在您更改枚举或计数变量有不同名称的情况下switch,您不会被迫更新代码。switchFOO_COUNT

否则,您将被转至David Rodríguez - dribeas的帖子

于 2012-08-24T14:00:30.217 回答
2

如果您仍想对其余部分发出警告,我唯一能想到的就是实际创建案例:

switch (foo) {
...
case FOO_COUNT: //empty
}
于 2012-08-24T14:01:00.393 回答