主要内容

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

MISRA C:2012 Rule 20.9

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

描述

规则定义

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

理由

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

报告中的补充消息

Identifier 未定义。

故障排除

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

示例

全部展开

#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 类别:必需

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.