对于嵌入式 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。
理论上,计算分支条件中使用的值可以改进处理器的分支预测,但优化编译器应该为您做这件事。我觉得这个答案可能很有趣:
我正在研究嵌入式 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。
理论上,计算分支条件中使用的值可以改进处理器的分支预测,但优化编译器应该为您做这件事。我觉得这个答案可能很有趣: