【问题标题】:Is there any c/c++ compiler that can warn (or give error) or enum conversion to int?是否有任何可以警告(或给出错误)或枚举转换为 int 的 c/c++ 编译器?
【发布时间】:2010-01-18 10:05:23
【问题描述】:

清理使用硬编码整数文字而不是枚举的旧 c/c++ 代码,查找函数声明已正确重构但未正确重构主体的地方是很乏味的。例如

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)或平台(大多数)中,手动运行几次就足够了,但我更喜欢不是太深奥或昂贵。

【问题讨论】:

  • gcc 不能完美处理这个问题吗?我正在使用 g++ 并且总是看到描述的警告。纯 C 编译器的行为是否不同?
  • 否,编译此代码(减去 ... 并加上一个空的 main()):g++ -Wall test.cpp 给出 0 个警告。警告从 int 到 enum 的提升,但不是相反。如果您有其他工作方式,请给我您的命令行。请...

标签: c++ c enums warnings


【解决方案1】:

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

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

夹板 (http://www.splint.org/download.html) 是您可以使用的现代皮棉

【讨论】:

  • 是的,对于较小的 c 部分,不幸的是,我们有 c++ 样式的 cmets,所以夹板会立即呕吐,我想我可以把它们扔掉。您知道任何能够使用或至少忽略 lint 的 OK c++ 吗?
【解决方案2】:

Sparse(Linux 内核人员使用的语义检查工具)可以帮助您解决其中的一些问题。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多