Cppcheckは、「冗長コード:数値定数から始まる声明を見つけた」と考えています。
-
28-10-2019 - |
質問
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のバグであると確信しています。異なる意見はありますか?
解決
私の推測は、どちらかです:
a) invalid
どういうわけか、他の場所で宣言または定義されています。
b)列挙は、ヘッダーが2回(ヘッダーガードなし)に含まれるヘッダーで定義されています。このコードで同じエラーが発生しているため:
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はもう文句を言いません。
これもように見えます 認識された問題.
他のヒント
Enumsには、署名されていない整数としてデータ型があります。
更新:実装が定義されているようです。 C ++列挙は署名されていますか、それとも署名されていませんか?
所属していません StackOverflow