【问题标题】:cppcheck thinks I have "Redundant code: Found a statement that begins with numeric constant"cppcheck 认为我有“冗余代码:找到以数字常量开头的语句”
【发布时间】:2011-06-19 20:14:54
【问题描述】:

Cppcheck (version 1.46.1) 对像这样的枚举给出以下警告:

enum DATABASE_TYPE
{
    DATABASE_TYPE_UNKNOWN = -1, // <- line of warning
    DATABASE_TYPE_ORACLE,
    DATABASE_TYPE_MSACCESS
};

冗余代码:找到一条语句 以数字常量开头

我不认为这是多余的。能够做到这样的事情非常重要。

这是 cppcheck 的错误还是我什么都没看到?

更新

我设法把它归结为一个最小的例子。由于 cppcheck 有 2 个(进一步的)错误,这使情况变得复杂,这使得我的减少看起来没有效果。
共有5个文件:a.ha.cppb.hb.cppinc.h,内容如下。
VC9 编译它没有警告(警告级别 4)。

// a.h
#pragma once
#include "inc.h"

// a.cpp
#include "a.h"
#include "b.h"

int main()
{
    return 0;
}


// b.h
#pragma once
#include "inc.h"

// b.cpp
#include "b.h"

//inc.h
#pragma once

enum MY_ENUM_TYPE
{
    INVALID_VALUE = -1,
    FIRST_VALUE,
    SECOND_VALUE
};

所以现在我很确定这是 cppcheck 的错误。有不同意见吗?

【问题讨论】:

  • 是的,这似乎是一个 cppcheck 错误 - #pragma once 不起作用。如果你用#ifndef A_H / #define A_H / #endif header wrapping 替换它,cppcheck 不会再抱怨了。
  • 这似乎也是一个公认的问题:sourceforge.net/apps/trac/cppcheck/ticket/2417
  • @kotlinksi:如果你用这个更新了你的答案,我可以将其标记为已接受。

标签: c++ enums warnings redundancy cppcheck


【解决方案1】:

我的猜测是:

A) invalid 以某种方式在别处声明或定义。

B) 枚举在包含两次的标头中定义(没有标头保护)。因为您在这段代码中遇到了同样的错误:

enum SomeEnumType
{
    invalid = -1,
    first,
    second,
};

enum SomeEnumType
{
    invalid = -1, // <- line of warning
    first,
    second,
};

您的代码是否使用 GCC 编译?


更新:

是的,这似乎是一个 cppcheck 错误 - #pragma once 不起作用。如果您将其替换为 #ifndef A_H / #define A_H / #endif 标头包装,cppcheck 不会再抱怨了。

这也像是recognized problem

【讨论】:

  • invalid 只是一个例子。实际上它看起来更像invalidSomeEnumType,所以它非常独特。
  • @foraidt:问关于假代码的问题真的是浪费时间。贴出真实代码,以便我们解决实际问题。
  • @foraidt:尝试创建会给出错误的最小示例,那么问题就很清楚了。无论如何,给它值 -1 不是问题,问题是 cppcheck 认为 invalid 已经定义。如果您发现 cppcheck 中存在错误,请向开发人员报告,他们会尽快修复。
  • @GMan:更新了。但我怀疑它现在还有没有用。在不检查整个代码库的情况下,仍然无法判断“无效”部分是否被多次定义。
  • @kotlinksi:我尝试创建一个最小的示例,但无法隔离问题。而且由于代码似乎可以编译并且工作正常,这就是我在这里询问它的原因。
【解决方案2】:

枚举的数据类型为无符号整数。

更新:似乎是实现定义的:Are C++ enums signed or unsigned?

【讨论】:

  • @Kotlinski :这是我指出的链接,作为我的答案的更新。并投反对票并再次指向我给出的相同链接。接受的答案清楚地说::“此外,标准说它是实现定义的,哪个整数类型用作枚举的基础类型,但它不得大于 int,除非某些值不能适合 int 或一个无符号整数。”
  • @ArunMu:在我看到你的更新之前发表了评论。无论如何,底层实现是 int 还是 unsigned int 并不重要,除非您与 . 进行比较
  • @Kotlinski:: 你怎么能这么说?如果实现与 unsigned int 一起使用,您认为它将负值作为负值吗? (除非是选角课程)
  • 引用:“枚举的底层类型是一个整数类型,可以表示枚举中定义的所有枚举值”。所以答案是不相关的,仍然以错误的陈述开头,因此投反对票。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-30
  • 2011-12-10
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多