7

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の内容。 VC9は、警告なしでコンパイルします(警告レベル4)。b.hb.cppinc.h

// 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のバグであるとかなり確信しています。意見の相違はありますか?

4

2 に答える 2

6

私の推測では、次のいずれかです。

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_Hcppcheck#endifは文句を言いません。

これも認識されている問題のようです。

于 2011-02-02T09:21:57.340 に答える
-2

列挙型のデータ型は符号なし整数です。

更新:実装が定義されているようです:C ++列挙型は署名されていますか、それとも署名されていませんか?

于 2011-02-02T09:30:18.493 に答える