在我的代码中,我习惯编写包含如下assert的回退默认情况,以防止在语义发生变化时忘记更新switch。
switch(mode) {
case ModeA: ... ;
case ModeB: ... ;
case .. /* many of them ... */
default: {
assert(0 && "Unknown mode!");
return ADummyValue();
}
};
现在我想知道人工后备检查的默认情况是否会干扰跳转表的生成?假设"ModeA"和"ModeB"等是连续的,因此编译器可以将它们优化为一个表。由于"default"情况包含一个实际的"return"语句(因为断言会在发布模式下消失,编译器会抱怨缺少返回语句),因此似乎不太可能使编译器优化默认分支。
最好的方法是什么?有人建议我用空指针解引用替换"ADummyValue",这样,在存在未定义行为的情况下,编译器可以省略警告缺少返回语句。有更好的解决方法吗?
assert
,最好是使用throw
或terminate
而不是return
。 - Mooing Duck