主要内容

MISRA C++:2023 Rule 19.0.2

R2026b

Function-like macros shall not be defined

自 R2024b 起

描述

Function-like macros shall not be defined. 1

理由

与使用类似函数的宏相比,使用函数具有某些优势。例如:

  • 可以将函数地址传递给另一个函数。

  • 可以重载函数并创建模板。

  • 可对函数参量和返回值执行类型检查。

有关使用函数而非宏的完整优势列表,请参阅 MISRA-C++:2023 标准。

Polyspace 实现

只要定义了类似函数的宏,Polyspace® 就会报告违规。以下是在宏定义中使用时,该规则的例外情况,因为无法在函数中实现它们的等效行为:

  • __LINE__

  • __FILE__

  • __func__

  • # 或 ## 运算符

当类似函数的宏定义为 (void)(X) 时,Polyspace 不会报告违规。这些类型的宏通常用于作为输入与函数一起使用。例如,可以使用此类宏将函数的返回值显式强制转换为 void。这种宏的用法无法由函数复制。

故障排除

如果您预期会出现违规,而 Polyspace 未报告该违规,请参阅诊断为何编码规范违规未按预期显示。

示例

全部展开

#define MAX(a, b) ((a) > (b) ? (a) : (b))           //Noncompliant
#define UNUSED(X) (void)(X)                         //Compliant
#define MSG(msg) printf("%d:%s\n",__LINE__,msg);    //Compliant

int main() {
    int x = 5;
    int y = 10;
    int max = MAX(x, y);

    return 0;
}

由于代码定义了类似函数的宏 MAX,且 MAX 不包含例外情况之一,因此 Polyspace 会报告违规。将 MAX 替换为函数,以符合规则。

宏 MSG 符合该规则,因为它使用了 __LINE__ 预处理器宏,属于合规的例外情况。宏 UNUSED(X) 属于合规的例外情况,因为它被定义为 (void)(X)。

检查信息

组:预处理指令
类别:必需
PQL 名称:std.misra_cpp_2023.R19_0_2

版本历史记录

在 R2024b 中推出


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.