如果带有枚举类型参数的开关错过了某些常量并且没有默认分支,则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)
应该不是.
我个人更喜欢另一种方法: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)
因此我的枚举没有警告。
该宏还可以适应生成其他有用的值,例如(在不连续枚举的情况下)所有值的数组(按顺序),这可能有助于自动迭代或检查是否存在等。
| 归档时间: |
|
| 查看次数: |
907 次 |
| 最近记录: |