2

我有一个关于 Misra 规则 19.7 的警告:在下面一行中,应该优先使用函数而不是类似函数的宏:

#define gOFFSETOF(type, mem) (gOFFSET)((size_t) ((char *)&((type *) 0)->mem - (char *)((type *) 0)))

我应该如何解决这个问题?

4

2 回答 2

2

规则 19.7 是建议性的,因此如果您只在合规矩阵中记录这样做,您可以随意忽略它。但是,这是一个非常好的规则,并且该宏非常不安全。你不应该在关键任务软件中编写这样的代码。

最好的解决方案确实像 MISRA 所说的那样,避免使用类似函数的宏,而是编写一个真正的函数。这样你就可以得到强类型和安全的代码。

于 2013-09-04T18:33:10.907 回答
1

规则 19.7(建议):应该优先使用函数而不是类似函数的宏。 虽然宏可以提供优于函数的速度优势,但函数提供了一种更安全、更健壮的机制。对于参数的类型检查以及类似函数的宏可能多次评估参数的问题尤其如此。

该规则是建议性的,因此这意味着它“通常应该被遵循”:

请注意,“建议”状态并不意味着可以忽略这些项目,而是应在合理可行的范围内遵循它们。咨询规则不需要正式的偏差,但如果认为合适,可以提出。

因此,您可以选择在不做出正式偏差的情况下打破规则。

现在,在回答您的问题“我应该如何解决这个问题?”时,您有两个选择,因为这个宏函数不能作为函数实现。

选项 1:偏离规则 19.7

该公告清楚地表明函数比宏函数更好,并引用了C Traps and Pitfalls, Andrew Koenig (1988)中关于将宏函数与函数进行比较的部分,但将其描述为一种偏好,特别是相对于设计的短宏函数为“速度优势”。

如果您认为这个宏使代码更清晰、更简洁,并且您已经适当地避免了宏函数的常见缺陷,那么您可以偏离规则 19.7,而无需做出正式的具体偏离,也不会导致不合规。

选项2:删除宏功能

如果在考虑了建议之后您认为它合适,则删除宏功能。您可能想要编写更多函数来分解额外的内联代码,和/或避免不必要的代码重复。

于 2013-08-26T14:12:49.013 回答