我已经定义了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)
一些 MISRA-C 规则是“非常建议性的”,以至于您不可能遵守它们,并且可能想要对它们提出永久偏差。一个完美的例子就是反对使用类似函数的宏的规则。
每个 C 程序员都知道类似函数的宏是不好的,原因有很多。但通常没有办法绕过它们。因此,该规则的重要性在于提醒人们,类函数宏应该是最后的手段,以防程序员以某种方式设法不知道这一点。该规则没有实际用途。
在这种特定情况下,宏似乎只是为了补偿错误的 API 或错误的调用者代码。有许多替代方法可以解决此问题:
其他事情:
无论是否有 MISRA,您的代码中都不应该有“幻数”。不应该21突然出现一个神奇的数字,这需要用一个命名常量替换。
另外,您应该使用stdint.h而不是使用您自己的整型车库标准。如果坚持使用 C90,则在与stdint.h.