CPPCHECK cree que tengo "código redundante: encontré una declaración que comienza con constante numérica"

StackOverflow https://stackoverflow.com/questions/4872566

Pregunta

Cppcheck (versión 1.46.1) Da la siguiente advertencia para un enum como este:

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

Código redundante: encontró una declaración que comienza con una constante numérica

No creo que sea redundante. Es bastante importante poder hacer cosas así.

¿Es este un error de cppcheck o no estoy viendo algo?

Actualizar

Logré reducirlo a un ejemplo mínimo. Esto fue complicado por CPPCheck con 2 (más) errores que hicieron que pareciera que mis reducciones no tuvieron ningún efecto.
Hay 5 archivos: a.h, a.cpp, b.h, b.cpp y inc.h con el siguiente contenido.
VC9 lo compila sin advertencias (nivel de advertencia 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
};

Así que ahora estoy bastante seguro de que es un error de cppcheck. ¿Alguna opinión divergente?

¿Fue útil?

Solución

Mi conjetura es, tampoco:

A) invalid de alguna manera se declara o define en otro lugar.

B) El enum se define en un encabezado incluido dos veces (sin guardias de encabezado). Porque obtienes el mismo error para este código:

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

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

¿Su código se compila con GCC?


ACTUALIZAR:

Sí, esto parece un error de cppcheck - #pragma once no está trabajando. Si lo reemplaza con #ifndef A_H / #define A_H / #endif Envoltura de encabezado, CPPCheck ya no se queja.

Esto también parece un problema reconocido.

Otros consejos

Los enums tienen tipo de datos como enteros sin firmar.

ACTUALIZACIÓN: Parece que está definida por implementación: ¿Están firmados o no firmados C ++?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top