对于嵌入式 C 中函数的 return 值,哪种形式更好?

Which form is better for return value of functions in embedded C?

我正在研究嵌入式 C。有人能帮我看看哪一段代码吗?

在稳健性、内存以及 Misra 友好方面是否高效?

代码 1:

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

代码2:

locvar = func();

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

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

MISRA-C 合规性和稳健性齐头并进。至于内存使用,在这段代码中不是问题。

第一个示例可能不稳健也不符合 MISRA:具体来说,MISRA-C:2012 规则 13.5 禁止 &&|| 的右操作数包含持续的副作用。

此外,像 12.1 这样的规则要求大表达式的子表达式用括号括起来,以使运算符优先级明确。

MISRA-C 兼容版本类似于:

locvar = func();

if ((locvar == 1) || (locvar == 2)) {
  ...
}

除了@Lundin 的回答,唯一的 MISRA C:2012 考虑是 持续的副作用 func() 中是否存在 - 如果没有持续的副作用 然后 MISRA C 没什么好说的。

同样,从代码效率的角度来看,高效的编译器将(可能)优化代码 - 它甚至可能 inline 函数体...

对我来说,主要考虑的是代码的可读性(以及因此的可维护性)——一次调用就可以清楚地说明你在做什么......如果没有持久的副作用 进行第二次函数调用有什么好处?

我投票给代码 2。

理论上,计算分支条件中使用的值可以改进处理器的分支预测,但优化编译器应该为您做这件事。我觉得这个答案可能很有趣: