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

Jan*_*dec 6 c++ gcc-warning

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

warning: enumeration value 'WHATEVER' not handled in switch
Run Code Online (Sandbox Code Playgroud)

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

enum foo {
    FOO_ONE,
    FOO_TWO,
    FOO_COUNT
};
Run Code Online (Sandbox Code Playgroud)

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

switch(foo) {
    case FOO_ONE:
        anything;
};
Run Code Online (Sandbox Code Playgroud)

应该发出警告,但是:

switch(foo) {
    case FOO_ONE:
        anything;
    case FOO_TWO:
        anything_else;
}
Run Code Online (Sandbox Code Playgroud)

应该不是.

Mat*_* M. 3

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

GENERATE_ENUM(foo, (FOO_ONE)(FOO_TWO))
Run Code Online (Sandbox Code Playgroud)

将产生:

enum foo {
    FOO_ONE,
    FOO_TWO
};

inline size_t size(enum foo) { return 2; }
Run Code Online (Sandbox Code Playgroud)

因此我的枚举没有警告。

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