我有一个关于 Misra 规则 19.7 的警告:在下面的行中,应该优先使用函数而不是类似函数的宏:
#define gOFFSETOF(type, mem) (gOFFSET)((size_t) ((char *)&((type *) 0)->mem - (char *)((type *) 0)))
我应该如何解决这个问题?
规则 19.7(建议):应优先使用函数而不是类似函数的宏。虽然宏可以提供比函数更快的速度优势,但函数提供了更安全、更健壮的机制。对于参数的类型检查以及类函数宏可能多次评估参数的问题尤其如此。
该规则是建议性的,因此这意味着“通常应该遵循”:
请注意,“建议”状态并不意味着可以忽略这些项目,而是应在合理可行的范围内遵循它们。正式的偏差对于咨询规则来说不是必需的,但如果认为合适的话可以提出。
因此,您可以选择打破规则,而无需做出正式的偏离。
现在,在回答您的问题“我应该如何解决这个问题?”时,鉴于此宏函数无法作为函数实现,您有两种选择。
选项 1:偏离规则 19.7
该公告明确指出函数比宏函数更好,并引用了C 《陷阱与陷阱》,Andrew Koenig (1988)将宏函数与函数进行比较,但将其描述为一种偏好,特别是相对于为“速度优势”而设计的短宏函数。
如果您相信这个宏使代码更清晰、更简洁,并且您已经适当地避免了宏函数的常见陷阱,那么您可以偏离规则 19.7,而不会造成正式的特定偏差,也不会违反规定。
选项2:删除宏功能
如果在考虑建议后您认为合适,则删除宏功能。您可能想要编写更多函数来分解额外的内联代码,和/或避免不必要的代码重复。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)