主要内容

MISRA C:2023 Rule 20.9

All identifiers used in the controlling expression of #if or #elif preprocessing directives shall be #define'd before evaluation

自 R2024a 起

描述

All identifiers used in the controlling expression of #if or #elif preprocessing directives shall be #define'd before evaluation 1 .

理由

如果尝试在预处理指令中使用宏标识符,而您尚未定义该标识符,则预处理器假设其值为零。此值可能不符合开发人员的预期。

故障排除

如果您预期会出现违规,但未看到该违规,请参阅诊断为何编码规范违规未按预期显示

示例

全部展开

#if M == 0                   /* Non-compliant - Not defined */
#endif

#if defined (M)              /* Compliant - M is not evaluate */
#if M == 0                   /* Compliant - M is known to be defined */
#endif
#endif

#if defined (M) && (M == 0)  /* Compliant
                              * if M defined, M evaluated in ( M == 0 ) */
#endif

#define XXYY 1                                          
#define ADD(a,b) a##b                                   

#if ADD(XX,YY)  // Compliant                                        
#endif

此示例显示了多种在预处理指令中使用 M 的情形。第二个和第三个 #if 子句会在计算 M 之前先检查软件是否定义了 M。第一个 #if 子句未检查是否已定义 M,由于未定义 M,因此该语句不合规。

在最后一个 #if 子句中,ADD 宏解析为标记 XXYY,该标记已定义。Polyspace® 不会报告违规。

检查信息

组:预处理指令
类别:必需
AGC 类别:必需
PQL 名称:std.misra_c_2023.R20_9

版本历史记录

在 R2024a 中推出


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.