此类宏构造是否需偏离MISRA C 2012/2020?规则疑问咨询
MISRA C合规性分析与疑问解答
代码示例
#include <stdio.h> #define ONE 1 #define TWO 2 #define OOPS 42 #define INNER_DEF_BAR(x) (bar_##x) #define DEF_BAR(x) void INNER_DEF_BAR(x)(void) DEF_BAR(ONE); DEF_BAR(TWO); DEF_BAR(OOPS); DEF_BAR(ONE) { printf("one\n"); } DEF_BAR(TWO) { printf("two\n"); } DEF_BAR(OOPS) { printf("42\n"); } int main() { bar_1(); bar_2(); bar_42(); return 0; }
宏构造的MISRA合规性判断
MISRA C 2012
你的宏构造不需要偏离MISRA C 2012标准,理由如下:
- Rule 20.7(强制规则):这条规则仅要求宏参数作为表达式一部分使用时必须用括号包裹。但你的代码中,宏参数
x是用于标识符拼接(##操作符),并非参与表达式运算,因此不属于这条规则的适用场景,不存在违规。 - 其他强制规则:宏生成的函数声明/定义符合MISRA对函数的基本要求(无嵌套定义、返回值明确等),未违反其他强制规则。
- 若涉及建议规则(如函数未加
static限制链接范围),MISRA不强制要求偏离,仅作推荐遵守。
MISRA C 2020
同样不需要偏离,对应Rule 17.7(原2012的Rule 20.7)的逻辑完全一致:宏参数用于标识符拼接而非表达式,不触发规则限制。整体宏构造未违反任何强制规则,合规性没问题。
关于Rule 20.7与X宏的困惑解答
Rule 20.7的核心逻辑:这条规则的目的是避免宏参数因运算符优先级导致意外展开结果,仅当宏参数作为表达式的组成部分(比如参与加减乘除等运算)时,才需要用括号包裹。如果宏参数是用于字符串/标识符拼接、直接作为字面量使用,都不适用这条规则,自然不存在违规。
X宏的偏离要求:X宏若仅违反MISRA的建议规则,确实不需要申请偏离——因为MISRA仅要求对违反强制规则的情况必须提交偏离申请。建议规则是推荐性的,不遵守无需走偏离流程。你的代码宏构造虽不属于典型X宏,但逻辑一致:只要不碰强制规则,就不需要偏离。
内容的提问来源于stack exchange,提问作者Guillaume D
相关产品推荐
相关产品推荐

