C++ 是否有信用证++;可以警告(或给出错误)或枚举转换为int的编译器?

C++ 是否有信用证++;可以警告(或给出错误)或枚举转换为int的编译器?,c++,c,enums,warnings,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: // th

清理使用硬编码整数文本而不是枚举的旧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)或平台(大多数)中,手动运行几次就足够了,但我更喜欢不太深奥或昂贵的东西。

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

641将枚举转换为int--在 需要计算,如算术运算符的参数,或 与积分参数相比。如果您选择此选项,则此警告将被抑制 使用枚举(+fie)的整数模型,但会损失一些有价值的数据 键入签入以执行此操作。中间策略是简单地关闭此选项 警告仍将捕获int到enum的赋值

Splint()是一种现代的lint,您可以使用它(linux内核人员使用的语义检查器工具),它可以帮助您解决一些问题

以下选项可以捕获枚举错误的子集:-Wenum不匹配,-Wcast truncate。但是,我运行了您的代码,看起来这些代码都没有被捕获


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

gcc不是很好地处理这个问题吗?我使用的是g++并且总是看到所描述的警告。纯C编译器的行为是否有所不同?否,使用:g++-Wall test.cpp编译此代码(减去…并加上一个空main())会给出0个警告。从int升级到enum时会发出警告,但不是相反。如果你有另一种工作方式,请给我你的命令行。请……是的,对于较小的C部分,不幸的是我们有C++风格的评论,所以夹板立即吐出来,我想我可以把它们删掉。你知道任何OK C++都能忽略LIT吗?