首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在嵌入式C中,哪一种形式更适合函数的返回值?

在嵌入式C中,哪一种形式更适合函数的返回值?
EN

Stack Overflow用户
提问于 2022-01-12 08:02:41
回答 3查看 223关注 0票数 6

我在做嵌入式C,有人能帮我一下哪一段代码吗?

在健壮性、记忆性以及Misra友好性方面是否有效?

Code1:

代码语言:javascript
复制
if (func() == 1 || func() == 2) {
    /* Body of the function */ 
}

Code2:

代码语言:javascript
复制
locvar = func();

if (locvar == 1 || locvar == 2) {
    /* Body of the function */    
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-01-12 11:09:13

对于@Lundin的回答,唯一的MISRA :2012的考虑是,如果func()内部存在持续的副作用--如果没有持久的副作用--那么MISRA就没有什么可说的了。

同样地,从代码效率的角度来看,一个高效的编译器(可能)会优化代码-它甚至可能inline函数体无论如何.

对我来说,首要考虑的是代码的可读性(因此也是可维护性)--一个调用就可以清楚地说明您在做什么……如果没有持久的副作用,那么进行第二个函数调用会得到什么好处呢?

我投票赞成第二条规则。

票数 4
EN

Stack Overflow用户

发布于 2022-01-12 08:39:59

如前所述,这两个例子可以做不同的事情,并给出不同的结果。

MISRA遵从性和健壮性并驾齐驱。至于内存的使用,这在这段代码中不是问题。

第一个例子可能不健壮,也不符合MISRA标准:具体来说,MISRA:2012规则13.5禁止&&||的右操作数包含持久的副作用。

此外,像12.1这样的规则要求大型表达式的子表达式被括号包围,以使运算符优先级显式化。

兼容MISRA-C的版本如下所示:

代码语言:javascript
复制
locvar = func();

if ((locvar == 1) || (locvar == 2)) {
  ...
}
票数 7
EN

Stack Overflow用户

发布于 2022-01-12 20:19:43

理论上,计算分支条件中使用的值可以改善处理器的分支预测,但是优化的编译器应该会这样做。认为这个答案可能很有趣:

conditional data transfers VS n conditional control transfers(using conditional mov) in Assembly

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

https://stackoverflow.com/questions/70678091

复制
相关文章

相似问题

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