私のコードでは、セマンティクスが変更された場合にスイッチを更新するのを忘れないように、次のようなアサートを含むフォールバックのデフォルト ケースを記述することに慣れています。
switch(mode) {
case ModeA: ... ;
case ModeB: ... ;
case .. /* many of them ... */
default: {
assert(0 && "Unknown mode!");
return ADummyValue();
}
};
人為的なフォールバック チェックのデフォルト ケースがジャンプ テーブルの生成に干渉するかどうか疑問に思っています。コンパイラがテーブルに最適化できるように、「ModeA」や「ModeB」などが連続していると想像してください。「デフォルト」ケースには実際の「return」ステートメントが含まれているため (リリース モードでアサートが消え、コンパイラーが return ステートメントの欠落についてうめき声を上げるため)、コンパイラーがデフォルト ブランチを最適化する可能性は低いようです。
これを処理する最良の方法は何ですか? 一部の友人は、未定義の動作が存在する場合にコンパイラが return ステートメントの欠落に関する警告を省略できるように、"ADummyValue" を null ポインター逆参照に置き換えることを勧めてくれました。これを解決するためのより良い方法はありますか?