You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

此类宏构造是否需偏离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宏的困惑解答

  1. Rule 20.7的核心逻辑:这条规则的目的是避免宏参数因运算符优先级导致意外展开结果,仅当宏参数作为表达式的组成部分(比如参与加减乘除等运算)时,才需要用括号包裹。如果宏参数是用于字符串/标识符拼接、直接作为字面量使用,都不适用这条规则,自然不存在违规。

  2. X宏的偏离要求:X宏若仅违反MISRA的建议规则,确实不需要申请偏离——因为MISRA仅要求对违反强制规则的情况必须提交偏离申请。建议规则是推荐性的,不遵守无需走偏离流程。你的代码宏构造虽不属于典型X宏,但逻辑一致:只要不碰强制规则,就不需要偏离。

内容的提问来源于stack exchange,提问作者Guillaume D

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 10:45:36