6

enum-type引数を持つスイッチが定数の一部を見逃し、デフォルトの分岐がない場合、gcc-Wswitchオプションは次のような警告を発生させます。

warning: enumeration value 'WHATEVER' not handled in switch

ただし、多くのスイッチは次のようなものです。

enum foo {
    FOO_ONE,
    FOO_TWO,
    FOO_COUNT
};

ここで、FOO_COUNTは値として表示されることはありませんが、定義され、変数に表示される可能性のある値の数を知るために使用されます。列挙型の値を使用して配列にインデックスを付けるか、ビットパッキングしているため、配列が適合するかどうかを確認する必要があります。したがって、すべての値を処理する列挙型には、この1つの定数を含めるべきではありません。その警告を維持する方法はありますが、そのような特別な値のためにそれを避けますか?つまり

switch(foo) {
    case FOO_ONE:
        anything;
};

警告を出す必要がありますが、:

switch(foo) {
    case FOO_ONE:
        anything;
    case FOO_TWO:
        anything_else;
}

すべきではありません

4

3 に答える 3

3

私は個人的に別のアプローチを好みenumます。カウントを設定するためにマクロを介して生成します。

GENERATE_ENUM(foo, (FOO_ONE)(FOO_TWO))

生成されます:

enum foo {
    FOO_ONE,
    FOO_TWO
};

inline size_t size(enum foo) { return 2; }

したがって、私の列挙型は警告なしです。

マクロは、反復の自動化や存在の確認などに役立つ可能性のあるすべての値の配列(順番に)など、他の有用な値を生成するように適合させることもできます。

于 2012-08-24T14:36:30.743 に答える
2

どのがすべての値を処理するかがすでにわかっている場合は、それらにキーワードをswitch追加できますがdefault:、同時に、にリストされていない他のすべての値をキャッチするswitch-caseため、忘れても警告は表示されません。例case FOO_ONE:

switch(value){
    case FOO_ONE:
        break;
    default:
        break;
}

また、マクロと組み合わせて、コードの1つのポイントから警告を「有効」にすることもできます。

#define m_ignore_switch_case_warnings default: break
//and define it like this to enable the warnings again
#define m_ignore_switch_case_warnings

switch(value){
    case FOO_ONE:
        break;

    m_ignore_switch_case_warnings;
}

あらゆる種類の警告を「無効」にすることができ、列挙型を変更した場合やカウント変数の名前が異なる場合にコードswitchを更新する必要はありません。switchFOO_COUNT

それ以外の場合は、DavidRodríguezに紹介されます-dribeasの投稿

于 2012-08-24T14:00:30.217 に答える
2

残りの警告を引き続き表示したい場合、私が考えることができるのは、実際にケースを作成することだけです。

switch (foo) {
...
case FOO_COUNT: //empty
}
于 2012-08-24T14:01:00.393 に答える