主要内容

MISRA C:2025 Rule 20.7

R2026b

Tokens that look like a preprocessing directive shall not occur within a macro argument

自 R2026b 起

描述

Tokens that look like a preprocessing directive shall not occur within a macro argument 1 .

理由

如果不使用圆括号,则在发生宏替换时,运算符优先级可能导致运算结果不符合预期。

如果未将宏参数用作表达式,则无需使用圆括号,因为该宏不涉及任何运算符。

故障排除

如果您预期会出现违规,但未看到该违规,请参阅诊断为何编码规范违规未按预期显示。

示例

全部展开

#define mac1(x, y) (x * y)
#define mac2(x, y) ((x) * (y))

void foo(void){
    int r;

    r = mac1(1 + 2, 3 + 4);       /* Non-compliant */
    r = mac1((1 + 2), (3 + 4));   /* Compliant */

    r = mac2(1 + 2, 3 + 4);       /* Compliant */
}

在此示例中,mac1 和 mac2 是两个已定义的宏表达式。mac1 的定义未将参量括在圆括号内。在第 7 行,宏展开为 r = (1 + 2 * 3 + 4);。该表达式可以是 (1 + (2 * 3) + 4) 或 (1 + 2) * (3 + 4)。但是,由于没有使用圆括号,程序不知道预期的表达式。第 8 行使用了圆括号,因此该行展开为 (1 + 2) * (3 + 4)。此宏表达式合规。

mac2 的定义将参量括在圆括号内。第 10 行(与第 7 行的宏参量相同)展开为 (1 + 2) * (3 + 4)。此宏和宏表达式合规。

检查信息

组:预处理指令
类别:必需
AGC 类别:必需
PQL 名称:std.misra_c_2025.R20_7

版本历史记录

在 R2026b 中推出


1 All MISRA coding rules and directives are © Copyright The MISRA Consortium Limited 2021.

The MISRA coding standards referenced in the Polyspace® Bug Finder™ documentation are from the following MISRA standards:

  • MISRA C:2004

  • MISRA C:2012

  • MISRA C:2023

  • MISRA C:2025

  • MISRA C++:2008

  • MISRA C++:2023

MISRA and MISRA C are registered trademarks of The MISRA Consortium Limited 2021.