有没有办法不警告gcc中的开关中缺少“COUNT”枚举常量?

时间:2012-08-24 13:58:00

标签: c++ gcc-warning

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

的警告
warning: enumeration value 'WHATEVER' not handled in switch

然而,我们的许多开关都是:

enum foo {
    FOO_ONE,
    FOO_TWO,
    FOO_COUNT
};

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

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

应该发出警告,但是:

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

3 个答案:

答案 0 :(得分:3)

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

GENERATE_ENUM(foo, (FOO_ONE)(FOO_TWO))

将产生:

enum foo {
    FOO_ONE,
    FOO_TWO
};

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

因此我的枚举是免费的。

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

答案 1 :(得分:2)

如果您已经知道哪个switch处理了所有值,则可以将default:关键字添加到这些值,但同时它会捕获未列在其中的所有其他值您的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的警告,如果您更改了枚举switch或者您已经更新FOO_COUNT代码,则无需更新{{1}}代码你的计数变量有不同的名称。

另外,您被引用David Rodríguez - dribeas的帖子

答案 2 :(得分:1)

如果你还想对其他人发出警告,我唯一能想到的就是真正创造案例:

switch (foo) {
...
case FOO_COUNT: //empty
}