不应定义具有保留意义的名称
6.1.2 ID_reservedName
自定义的名称不应与标准库或编译环境中的名称相同,否则会导致标准未定义的行为,也不利于阅读和维护。
下列名称具有保留意义,自定义名称不应与之相同:
- 标准库或编译环境中的宏名称
- 标准库中具有外部链接性的对象或函数名称
- 标准库中的类型名称
自定义字面常量后缀应以下划线开头,否则为保留名称,除此之外:
- 以两个下划线开头的名称
- 以一个下划线和一个大写字母开头的名称
- 以下划线开头的全局名称
均具有保留意义,自定义名称应避免这种命名方式。
对于宏,本规则特化为 ID_macro_defineReserved、ID_macro_undefReserved。
示例:
#include <errno.h>
struct A {
void foo() {
if (errno != 0) { // Which errno?
....
}
}
private:
int errno; // Non-compliant
};
例中成员变量 errno 与标准库中的 errno 名称相同,不便于区分是自定义的还是系统定义的。
又如:
size_t _Size(); // Non-compliant
size_t operator "" KB(unsigned long long n) { // Non-compliant
return n * 1024;
}
例中函数名 _Size 以一个下划线和一个大写字母开头,自定义字面常量后缀 KB 未以下划线开头,均不符合要求。
相关
依据
ISO/IEC 9899:1999 7.1.3(1)
ISO/IEC 9899:2011 7.1.3(1)
ISO/IEC 14882:2003 17.4.3.1
ISO/IEC 14882:2011 17.6.4.3
ISO/IEC 14882:2017 20.5.4.3
参考
MISRA C 2012 21.2
MISRA C++ 2008 17-0-1
MISRA C++ 2008 17-0-2
MISRA C++ 2008 17-0-3
SEI CERT DCL37-C
SEI CERT DCL51-CPP