☰
  • 首页
  • 规则分类
  • 项目介绍
search
•••

不可定义具有保留意义的宏名称

3.2.2 ID_macro_defineReserved
目录 › next › previous

重新定义已有特殊用途的名称会导致标准未定义的行为,也会使代码陷入难以维护的境地。

标准库、编译环境中的名称以及关键字不应重新定义。

C++ 标准指明不可重新定义的宏有:

__cplusplus、__TIME__、__DATE__、__FILE__、__ LINE__、
__STDC__、__STDC_HOSTED__、__STDCPP_THREADS__、
__STDC_MB_MIGHT_NEQ_WC__、__STDC_VERSION__、
__STDC_ISO_10646__、__STDCPP_STRICT_POINTER_SAFETY__

以下划线开头的名称用于表示标准库或编译环境的保留名称,自定义名称不应以下划线开头。

示例:

#define _WIN64   0      // Non-compliant
#define __GNUC__ 1      // Non-compliant
#define __STDC__ 1      // Non-compliant, undefined behavior
#define __cplusplus 0   // Non-compliant, undefined behavior

标识平台或编译环境的宏不可在代码中写死。

#define defined            // Non-compliant, undefined behavior
#define new new(nothrow)   // Non-compliant

不可重定义关键字。

#define NDEBUG 0    // Non-compliant
#define errno 0     // Non-compliant
#define assert(x)   // Non-compliant

编译优化相关的宏不可在代码中写死,标准库中的名称不应被重新定义。

配置

keywordAsReserved: 是否将关键字作为保留名称 stdNameAsReserved: 是否将标准库中的名称作为保留名称 underscoreAsReserved: 是否将下划线开头的名称作为保留名称 reservedNames: 用户指定的保留名称

相关

ID_macro_undefReserved ID_reservedName

依据

ISO/IEC 9899:1999 7.1.3(2)-undefined ISO/IEC 9899:2011 7.1.3(2)-undefined ISO/IEC 14882:2003 16.8(3)-undefined ISO/IEC 14882:2011 16.8(4)-undefined

参考

MISRA C 2012 20.4 MISRA C 2012 21.1 MISRA C++ 2008 17-0-1
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.