主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

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 之所以高效,是因为它是一个编译时常量。

如果预处理指令不用于包含或包含保护,请避免使用它们。相反,请使用内嵌函数、constconstexpr 对象以及模板等功能。

Polyspace 实现

Polyspace® 在包含的头文件中触发了此规则的违规,当以下任一条件为真时:

  • #define 用于包含守护语句之外。这些 #define 语句通常定义常量和类似函数的宏。

  • #ifndef 用于包含守护语句之外。

Polyspace 认为这个惯用法是正确的包含保护惯用法:

#ifndef <identifier>
#define <identifier>
#endif

故障排除

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

示例

全部展开

file1.hmain.cpp

#ifndef MY_FILE
#define MY_FILE //Compliant
#endif
#define PI 3.1416 //Noncompliant
constexpr double pi = 3.1416;

#include"file1.h"
//...

在此示例中,包含文件 file1.h 包含两个 #define 语句。第一个 #define 指令用于包含保护中。该指令合规。第二个 #define 指令定义了常量宏 PI。该指令不合规,Polyspace 会对其进行标记。更好的替代方案是使用一个 constexpr 变量。

检查信息

组:预处理指令
类别:必需

版本历史记录

在 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.