是否有任何c / c ++编译器可以警告(或给出错误)或枚举转换为int?

时间:2010-01-18 10:05:24

标签: c++ c enums warnings

清理使用硬编码整数文字而不是枚举的旧c / c ++代码,找到功能声明已被正确重构但不是正文的地方是很繁琐的。 e.g。

enum important {
  little = 1,
  abit = 2,
  much = 3
};

void blah(int e)
{
  // magic stuff here
}

void boing(int e) { ... }

void guck(important e)
{
  switch (e) {
    case 3:  // this would be a good place for a warning
      blah(e);  // and this
      break;
    default:
      boing((int)e); // but this is OK (although imperfect and a warning would be acceptable)
      break;
  }
}

注释/修改每个枚举类型或搜索它们的代码也是相当多的工作,因为有很多不同的枚举,所以这不是首选,但可能是一个可接受的解决方案。

我不需要它在我们的任何主编译器或其他工具(主要是gcc)或平台(大多数)中,手动运行几次就足够了,但我更喜欢不太有用的东西深奥或昂贵。

2 个答案:

答案 0 :(得分:1)

lint将为您提供此警告(条件641)

  

641将枚举转换为int - 在上下文中使用枚举类型   需要计算,例如算术运算符的参数或者是   与积分论证相比较。如果你这个警告将被禁止   使用枚举的整数模型(+ fie)但是你会失去一些有价值的东西   这样做的类型检查。中间政策就是简单地关闭它   警告。仍将捕获int到枚举的赋值。

Splint(http://www.splint.org/download.html)是一种可以使用的现代棉绒

答案 1 :(得分:1)

Sparse(Linux内核人员使用的语义检查工具)可以帮助您完成其中的一些工作。

这些选项可以捕获枚举错误的子集:-Wenum-mismatch,-Wcast-truncate。但是,我通过这个运行你的代码,看起来并没有被捕获。

这是免费软件,如果你想扩展它。