CPPCHECK cree que tengo "código redundante: encontré una declaración que comienza con constante numérica"
-
28-10-2019 - |
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?
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 ++?