cppcheck считает, что у меня есть «Избыточный код: найден оператор, который начинается с числовой константы» - PullRequest
7 голосов
/ 02 февраля 2011

Cppcheck (версия 1.46.1) выдает следующее предупреждение для такого перечисления:

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

Избыточный код: найдено утверждение, что начинается с числовой константы

Я не думаю, что это избыточно. Очень важно уметь делать такие вещи.

Это ошибка cppcheck или я чего-то не вижу?

Обновление

Мне удалось свести это к минимальному примеру. Это было осложнено тем, что у cppcheck было 2 (дальнейших) ошибки, из-за которых казалось, что мои сокращения не дали эффекта. Существует 5 файлов: a.h, a.cpp, b.h, b.cpp и inc.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. Любые расходящиеся мнения?

Ответы [ 2 ]

6 голосов
/ 02 февраля 2011

Я предполагаю, что либо:

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 больше не будет жаловаться.

Это также похоже на распознанную проблему .

0 голосов
/ 02 февраля 2011

перечисления имеют тип данных как целые числа без знака.

Обновление: похоже, что это определено реализацией: Перечисляются ли C ++ перечисления со знаком или без знака?

...