gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:10:33 25 4
gpt4 key购买 nike

我已经定义了 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 规则“非常建议性”,以至于您可能无法遵守它们并且可能想要对它们提出永久性偏差。一个完美的例子就是禁止使用类函数宏的规则。

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

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

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

其他:

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

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

关于c - 类似函数的宏, 'REPORT_ERROR',已定义 [MISRA 2012 指令 4.9,咨询],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58079170/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com