首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在交换机中替代返回-情况

在交换机中替代返回-情况
EN

Stack Overflow用户
提问于 2022-05-15 14:18:28
回答 3查看 339关注 0票数 -1

我想把东西放回一个开关箱里。然而,在开关情况下使用返回违反了MISRA规则6-4-3,所以我正在寻找替代方案。

规则说:开关语句应该是格式良好的开关语句.在开关子句中不得使用返回语句。

代码:

代码语言:javascript
复制
switch(x) {
  case 0:
   doSomething();
   break;
  case 1:
   return true; // violates MISRA 6-4-3
  case 2:
   doSomething();
   break;
  default:
   doSomething();
   break;
}

我知道这是可以这样解决的:

代码语言:javascript
复制
bool var = false;
switch(x) {
  case 0:
   doSomething();
   break;
  case 1:
   var = true;
   break;
  case 2:
   doSomething();
   break;
  default:
   doSomething();
   break;
}
return var;

但是如果可能的话,我想不需要额外的代码来解决这个问题。

EN

回答 3

Stack Overflow用户

发布于 2022-05-15 17:37:14

阅读米斯拉C++ 2008标准,它什么也没有说:

在开关条款中不应使用返回语句。

但是,它确实说:

函数的末尾应有一个出口点。

所以,无论如何,您都不能在return中使用case。您别无选择,只能使用局部变量来记住case想要返回的值,然后在函数末尾的最终return中使用该变量。

票数 3
EN

Stack Overflow用户

发布于 2022-05-15 14:47:12

还不清楚函数中是否有更多的代码。

但是做这样的事情很简单:

代码语言:javascript
复制
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;
票数 2
EN

Stack Overflow用户

发布于 2022-05-16 08:42:48

MISRAs的多重return规则已经被争论了很多次(在这里和其他地方)。但是,如果我们跳过该规则和switch格式规则的具体内容,那么这些规则的本质就归结为“不要只为它编写不必要的复杂/意大利面代码”。这就是你在这里要做的。即使是编写陌生的代码也不是解决方案。

您应该做的是放弃这个奇怪的switch语句,转而采用更明智的方法,例如:

代码语言:javascript
复制
if(x == 1) // comment explaining why this is a special case
{
  return true;
}

doSomething();

这可能不符合米斯拉,但它符合常识。任何剩余的MISRA警告很可能是因为咨询规则,在这种情况下,您可以忽略它们。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72249093

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档