MISRA C++:2008 Rule 16-2-1
The preprocessor shall only be used for file inclusion and include guards
描述
规则定义
The preprocessor shall only be used for file inclusion and include guards. 1
理由
除了包含和包含保护外,您还可以将预处理器指令用于其他目的,例如定义常量或函数类宏。这些预处理器指令不遵守典型的链接,并且缺乏范围机制或类型安全。与同等的 C++ 功能相比,预处理器指令的安全性较低。例如,使用 #define
语句定义的常量即使在局部范围内定义,也会在所有范围内保持其值不变。使用 #define
预处理器而非 constexpr
可能会导致混淆,尤其是在不同作用域中定义了相同常量时。由于 constexpr
变量具有明确的作用域,因此它是一种更安全的替代方案。constexpr
之所以高效,是因为它是一个编译时常量。
如果预处理指令不用于包含或包含保护,请避免使用它们。相反,请使用内嵌函数、const
或 constexpr
对象以及模板等功能。
Polyspace 实现
Polyspace® 在包含的头文件中触发了此规则的违规,当以下任一条件为真时:
#define
用于包含守护语句之外。这些#define
语句通常定义常量和类似函数的宏。#ifndef
用于包含守护语句之外。
Polyspace 认为这个惯用法是正确的包含保护惯用法:
#ifndef <identifier> #define <identifier> #endif
故障排除
如果您预期会出现违规,而 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.