MISRA C++:2008 Rule 16-2-2
C++ macros shall only be used for: include guards, type qualifiers, or storage class specifiers
描述
规则定义
C++ macros shall only be used for: include guards, type qualifiers, or storage class specifiers. 1
理由
除了定义包含保护符、类型限定符和存储类指定符外,您还可以将 C++ 宏用于其他目的,例如定义常量或函数类宏。这些宏不遵循典型的链接规则,且缺乏作用域机制或类型安全。与 C++中可用的其他选项相比,宏的安全性较低。例如,使用 #define
语句定义的常量即使在局部范围内定义,也会在所有范围内保持其值不变。使用宏代替 constexpr
可能会导致混淆,如果您在不同作用域中定义了不同的常量。由于 constexpr
变量具有明确的作用域,因此它是一种更安全的替代方案。constexpr
之所以高效,是因为它是一个编译时常量。
如果宏未用于定义包含保护、类型修饰符或存储类指定符,请避免使用宏。相反,请使用内联函数、const
或 constexpr
对象以及函数模板等功能。
Polyspace 实现
检查项会对 #define
语句进行标记,当宏展开的内容不是头文件保护、类型限定符或存储类说明符(如 static
、inline
、volatile
、auto
、register
和 const
)时,就会进行标记。
故障排除
如果您预期会出现违规,而 Polyspace® 未报告该违规,请参阅诊断为何编码规范违规未按预期显示。
示例
检查信息
组:预处理指令 |
类别:必需 |
版本历史记录
在 R2013b 中推出
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++:2008
MISRA C++:2023
MISRA and MISRA C are registered trademarks of The MISRA Consortium Limited 2021.