C ++では、列挙型は安全ではありません。enum値がenum宣言で定義された値の1つであると期待することはできません。
- 初期化されていない可能性があります(したがってゴミ)
static_cast
あなたはから不適切を持っている可能性がありますint
したがって、列挙型のすべての要素をカバーしている場合でも、コンパイラはスイッチが戻ることを期待できません。ただし、機能的には、これは本当にエラー状態です。
反応する方法は2つあります。
- ケースを追加
default
しますenum
- 切り替え後にステートメントを追加する
賢明に選択するために、コンパイラは、ステートメントがないという条件で、 aswitch
がのすべてのケースをカバーしていないときはいつでも、(あなたがそれを求めれば)警告をトリガーするかもしれないことを覚えておいてください。スマートコンパイラ(つまりClang)を使用すると、警告をエラーに個別にマッピングできるため、これらのバグを見つけるのに非常に役立ちます。enum
default
したがって、次のことを行う必要があります。
- 列挙型の更新後にこのメソッドを変更するのを忘れたときに通知を受け取りたい場合は、使用しないでください
default
- 列挙型を更新してこのスイッチを無視できるようにする場合は、
default
最後に、実行時エラーの使用はデフォルトのステートメントの使用と矛盾することに注意して、どのように対応するかを決定する必要があります(可能な限りコンパイル時にエラーをキャッチするのが最善です)。
- エラーを無視して、事前定義された値を返します
- 例外をスローします(列挙値を使用してください)
- アサート(したがって、デバッグで激しくクラッシュし、メモリダンプを取得し、リリースで何もしない、例外をスローするなど、他のことを実行します)
私の個人的なお気に入りはUNREACHABLE(Text_)
マクロです。これは、デバッグでメモリダンプを引き起こし(完全なトレースを取得するため)、エラーをログに記録してリリースをスローします(サーバーがこの要求の処理を停止しますが、応答を完全に停止しないようにします)。
これにより、次のようなコードが得られます。
char const* func(ENUM x)
{
switch(x)
{
case Option1: return "Option1";
case Option2: return "Option2";
case Option3: return "Option3";
}
UNREACHABLE("func(ENUM)")
}