避免误报-Wswitch警告

时间:2016-08-26 16:35:27

标签: c enums

让我们有一个值列表(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)替换枚举的最后一个值,使其不再是枚举的一部分。
    缺点:它要求每次将值添加到列表时手动更新定义。有人会忘记,打破一切。

理想情况下,应该有一种方法可以将枚​​举值标记为不可赋值,从而使得在读取可能的值时不会在编译器中产生警告,而且这个值不存在,无需预处理器宏需要重复修改。

有类似的东西吗?我没有想到的任何其他选择?

1 个答案:

答案 0 :(得分:2)

使用

case _foo_length:
    unreachable();
    break;

以便处理所有案件。你可以为它创建一个宏,以防止它变得如此冗长。