定义了类似函数的宏“REPORT_ERROR”[MISRA 2012 指令 4.9,建议]

kap*_*dit 0 c lint misra

我已经定义了MACRO,它将调用该函数并传递参数。对于这种情况,低于 MISRA 警告。难道不允许吗?如何避免这种情况?

调用下面的函数有什么优点MACRO

#define REPORT_ERROR(Id, Error) ReportErr((uint16)21, (uint8)0, (uint8)Id, (uint8)Error)

void ReportErr(uint16 ModuleId, uint8 InstanceId, uint8 ApiId, uint8 ErrorId)
{

  // function - body

}
Run Code Online (Sandbox Code Playgroud)

Lun*_*din 5

一些 MISRA-C 规则是“非常建议性的”,以至于您不可能遵守它们,并且可能想要对它们提出永久偏差。一个完美的例子就是反对使用类似函数的宏的规则。

每个 C 程序员都知道类似函数的宏是不好的,原因有很多。但通常没有办法绕过它们。因此,该规则的重要性在于提醒人们,类函数宏应该是最后的手段,以防程序员以某种方式设法不知道这一点。该规则没有实际用途。

在这种特定情况下,宏似乎只是为了补偿错误的 API 或错误的调用者代码。有许多替代方法可以解决此问题:

  • 通过允许调用者传递 NULL 或类似参数,使某些函数参数可选。
  • 在调用方使用某种默认参数集,并根据用例选择参数。
  • 如果以上都不可行,请使用单独的函数或内联包装函数。

其他事情:

无论是否有 MISRA,您的代码中都不应该有“幻数”。不应该21突然出现一个神奇的数字,这需要用一个命名常量替换。

另外,您应该使用stdint.h而不是使用您自己的整型车库标准。如果坚持使用 C90,则在与stdint.h.