在我的代码中,我习惯于编写包含如下断言的回退默认案例,以防止我在语义发生变化时忘记更新开关
switch(mode) {
case ModeA: ... ;
case ModeB: ... ;
case .. /* many of them ... */
default: {
assert(0 && "Unknown mode!");
return ADummyValue();
}
};
现在我想知道人工回退检查默认情况是否会干扰跳转表生成?想象一下“ModeA”和“ModeB”等是连续的,因此编译器可以优化成一个表。由于“默认”案例包含一个实际的“返回”语句(因为断言将在发布模式下消失并且编译器会抱怨缺少的返回语句),编译器似乎不太可能优化默认分支。
处理这个问题的最佳方法是什么?一些朋友建议我将“ADummyValue”替换为空指针取消引用,以便编译器在存在未定义行为时可以省略对缺少返回语句的警告。有没有更好的方法来解决这个问题?