主要内容

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

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

如果宏未用于定义包含保护、类型修饰符或存储类指定符,请避免使用宏。相反,请使用内联函数、constconstexpr 对象以及函数模板等功能。

Polyspace 实现

检查项会对 #define 语句进行标记,当宏展开的内容不是头文件保护、类型限定符或存储类说明符(如 staticinlinevolatileautoregisterconst)时,就会进行标记。

故障排除

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

示例

全部展开

#ifndef IDENTIFIER //Compliant
#define IDENTIFIER //Compliant
#endif             //Compliant - Include guard

#define STOR extern      // Compliant - Storage class specifier
#define VOL volatile	 //Compliant - Type qualifier

#define CLOCK (xtal/16)              // Noncompliant
#define PLUS2(X) ((X) + 2)           // Noncompliant
#define PI 3.14159F                  // Noncompliant
#define int32_t long                 // Noncompliant
#define STARTIF if(                  // Noncompliant
#define INIT(value) {(value), 0, 0}  // Noncompliant
#define HEADER "filename.h"          // Noncompliant

在此示例中,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.