我对Misra规则19.7有一个警告:应该使用一个函数,而不是下面一行中类似函数的宏:
#define gOFFSETOF(type, mem) (gOFFSET)((size_t) ((char *)&((type *) 0)->mem - (char *)((type *) 0)))
我应该如何解决这个问题?
答案 0 :(得分:1)
规则19.7(建议):应优先使用函数,而不是像函数一样的宏。 虽然宏可以提供超越功能的速度优势,但功能提供了更安全和更健壮的机制。对于参数的类型检查以及类似函数的宏可能多次评估参数的问题尤其如此。
该规则是建议性的,因此这意味着“通常应该遵循”:
请注意,“建议”的状态并不意味着可以忽略这些项目,但是在合理实际的范围内应该遵循这些项目。咨询规则不需要正式偏差,但如果认为合适则可以提出。
所以你可以选择在没有正式偏离的情况下违反规则。
现在,在回答你的问题时,“我该如何解决这个问题?”,你有两个选择,因为这个宏功能不能作为一个函数来实现。
该通报清楚地表明函数比宏函数更好,并引用 C陷阱和陷阱中的部分,Andrew Koenig(1988)将宏函数与函数进行比较,但将其描述为偏好,特别是针对“速度优势”设计的短宏功能。
如果您认为这个宏使代码更清晰,更简洁,并且您已经适当地避免了宏功能的常见缺陷,那么您可以偏离规则19.7而不会产生正式的特定偏差,并且不会失去合规性。
如果在考虑了您认为合适的建议后,请删除宏功能。您可能希望编写更多函数来分解额外的内联代码,和/或避免不必要的代码重复。
答案 1 :(得分:0)
规则19.7是建议性的,因此如果您只在合规矩阵中记录,则可以自由地忽略它。但是,这是一个非常好的规则,宏非常不安全。你不应该在任务关键型软件中编写类似的代码。
确实最好的解决方案就像MISRA所说的那样,避免使用类似函数的宏,而是编写一个真正的函数。这样你就可以获得强大的输入和安全的代码。