类似函数的宏,'REPORT_ERROR',已定义 [MISRA 2012 指令 4.9,咨询]

Function-like macro, 'REPORT_ERROR', defined [MISRA 2012 Directive 4.9, advisory]

我已经定义了 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

}

某些 MISRA-C 规则“非常建议性”,以至于您可能无法遵守它们并且可能想要对它们提出永久性的偏差。一个完美的例子就是禁止使用 function-like 宏的规则。

每个 C 程序员都知道 function-like 宏是不好的,原因很多。但通常没有办法绕过它们。所以这条规则的重要性在于提示 function-like 宏应该是最后的手段,以防程序员不知何故设法没有意识到这一点。该规则没有实际用途。

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

  • 通过允许调用者传递 NULL 或类似参数,使某些函数参数可选。
  • 使用在 caller-side 上设置的某种默认参数,并根据 use-case 选择参数。
  • 如果以上都不是选项,请使用单独的函数或内联包装函数。

其他:

MISRA 或没有 MISRA,您的代码中的任何地方都不应该有“幻数”。不应该突然出现一个神奇的数字 21,这需要用命名常量替换。

此外,您应该使用 stdint.h 而不是使用您自己的整数类型车库标准。如果坚持使用 C90,则在自定义 header 中使用与 stdint.h.

中对应的类型定义