我想把东西放回一个开关箱里。然而,在开关情况下使用返回违反了MISRA规则6-4-3,所以我正在寻找替代方案。
规则说:开关语句应该是格式良好的开关语句.在开关子句中不得使用返回语句。
代码:
switch(x) {
case 0:
doSomething();
break;
case 1:
return true; // violates MISRA 6-4-3
case 2:
doSomething();
break;
default:
doSomething();
break;
}我知道这是可以这样解决的:
bool var = false;
switch(x) {
case 0:
doSomething();
break;
case 1:
var = true;
break;
case 2:
doSomething();
break;
default:
doSomething();
break;
}
return var;但是如果可能的话,我想不需要额外的代码来解决这个问题。
发布于 2022-05-15 17:37:14
阅读米斯拉C++ 2008标准,它什么也没有说:
在开关条款中不应使用返回语句。
但是,它确实说:
函数的末尾应有一个出口点。
所以,无论如何,您都不能在return中使用case。您别无选择,只能使用局部变量来记住case想要返回的值,然后在函数末尾的最终return中使用该变量。
发布于 2022-05-15 14:47:12
还不清楚函数中是否有更多的代码。
但是做这样的事情很简单:
bool abort = false;
switch(x) {
case 0:
doSomething();
break;
case 1:
abort = true;
break;
case 2:
doSomething();
break;
default:
doSomething();
break;
}
if (abort)
return true;发布于 2022-05-16 08:42:48
MISRAs的多重return规则已经被争论了很多次(在这里和其他地方)。但是,如果我们跳过该规则和switch格式规则的具体内容,那么这些规则的本质就归结为“不要只为它编写不必要的复杂/意大利面代码”。这就是你在这里要做的。即使是编写陌生的代码也不是解决方案。
您应该做的是放弃这个奇怪的switch语句,转而采用更明智的方法,例如:
if(x == 1) // comment explaining why this is a special case
{
return true;
}
doSomething();这可能不符合米斯拉,但它符合常识。任何剩余的MISRA警告很可能是因为咨询规则,在这种情况下,您可以忽略它们。
https://stackoverflow.com/questions/72249093
复制相似问题