让我们有一个值列表(foo.lst):
foo,
bar,
baz,
让我们从这个
中得到一个枚举enum foo {
#include "foo.lst"
_foo_length
};
让我们在switch
:
int main(void) {
enum foo[_foo_length];
switch(f[0]) {
case foo: return 0;
case bar: return 0;
case baz: return 0;
}
__builtin_unreachable();
}
(这段代码很愚蠢,但忽略了这一点)
问题:
使用-Wswitch
(包含在-Wall
)中,GCC和Clang(以及可能还有其他人)会发出警告:
警告:交换机[-Wswitch]中未处理枚举值'_foo_length'
解决方案:
-Wno-switch
会隐藏该警告
缺点:我们失去了关于交换机中任何其他case
失踪的警告。default: unreachable();
案例
缺点:我们丢失了丢失案例的编译时警告,如果我们在调试时碰到其中一个丢失的案例,则会支持运行时崩溃。#define _foo_length (baz + 1)
替换枚举的最后一个值,使其不再是枚举的一部分。理想情况下,应该有一种方法可以将枚举值标记为不可赋值,从而使得在读取可能的值时不会在编译器中产生警告,而且这个值不存在,无需预处理器宏需要重复修改。
有类似的东西吗?我没有想到的任何其他选择?
答案 0 :(得分:2)
使用
case _foo_length:
unreachable();
break;
以便处理所有案件。你可以为它创建一个宏,以防止它变得如此冗长。