case 和 default 标签应直接从属于 switch 语句
9.5.5 ID_switch_badFormedCase
不直接从属于 switch 语句的 case 或 default 标签用于非结构性跳转,是公认的不良实现。
关于非结构性跳转的进一步讨论可参见 ID_forbidGoto。
示例:
switch (v)
{
case 1: // Compliant
if (cond)
{
case 2: // Non-compliant
....
}
else
{
default: // Non-compliant
....
}
}
例中 case 1 直接从属于 switch 语句,而 case 2 和 default 直接从属于 if 语句,当 v 的值不是 1 时,会绕过 if 语句的条件判断,产生非结构性跳转,与 goto 语句的问题一样,很容易导致逻辑混乱且不利于维护。
虽然有些编程技巧会将 case 置于循环中,如“Duff’s device”等,但当今主流的编程语言均已不再提倡非结构性跳转。
相关
参考
MISRA C 2004 15.1
MISRA C 2012 16.2
MISRA C++ 2008 6-4-4