我试图从我的代码中删除违反规则15.5。
示例代码:
#define RETURN_VAL(num) {return (2 * num);}
static int32_t
func(int32_t n1, int32_t n2, int32_t n3)
{
if (n1 == 1) {
RETURN_VAL(1);
}
if (n2 == 2) {
RETURN_VAL(2);
}
if (n3 == 3) {
RETURN_VAL(3);
}
return 0;
}
由于MACRO(具有返回值)在多个地方使用,导致违反规则15.5。
无论如何都要把这个保留为MACRO本身。
答案 0 :(得分:1)
您可以使用整数retval
如果您在返回之前必须使用宏,如下所示。不要使用宏隐藏return语句。它不会影响任何MISRA分析。
#define RET(num) (2 * num)
static int32_t
func(int32_t n1, int32_t n2, int32_t n3)
{
int32_t retval = 0;
if (n1 == 1) {
retval = RET(1);
}
else if (n2 == 2) {
retval = RET(2);
}
else if (n3 == 3) {
retval = RET(3);
}
return retval;
}
答案 1 :(得分:0)
关于在函数中使用多个return语句,如果它导致更可读的代码,则完全没问题。规则15.5是一个值得怀疑的问题,有一个可疑的理由,see this。
话虽如此,这里的主要问题是使用无意义的函数式宏,这违反了MISRA-C的指令4.9。总的来说,功能界面很奇怪,你真的需要使用3个命名参数吗?一个更好的选择:
static int32_t func(int32_t n[N])
{
for(int32_t i=0; i<N; i++)
{
if(n[i] == i+1)
{
return 2 * (i+1);
}
}
return 0;
}
如果由于某种原因必须保留icky API,请使用包装器:
inline static int32_t func_wrapper (int32_t n1, int32_t n2, int32_t n3)
{
return func( (int32_t[3]){n1, n2, n3} );
}