不可定义具有保留意义的宏名称
3.2.2 ID_macro_defineReserved
重新定义已有特殊用途的名称会导致标准未定义的行为,也会使代码陷入难以维护的境地。
标准库、编译环境中的名称以及关键字不应重新定义。
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: 用户指定的保留名称
相关
依据
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