遵循合理的命名方式
6.1.1 ID_badName
应遵循易于读写,并可准确表达代码意图的命名方式。
不应出现下列情况:
- 超长的名称
- 易造成混淆或冲突的名称
- 无意义或意义过于空泛的名称
- 不易于读写的名称
- 有违公序良俗的名称
示例:
int xxx(int); // Bad, meaningless name
int fun(int); // Bad, vague name
int l, I, O, l0, Il; // Bad, like numbers
int YE5, N0; // Bad, like a word but not
int \u540d\u79f0; // Bad, no readability
int nVarietyisthespiceoflife = 123; // Bad, hard to read or write
例中 xxx、fun 这种无意义或意义过于空泛的名称,以及 l、lI、N0 这种易与数字或其他单词混淆的名称均是不符合要求的;Unicode 转义名称只应出现在字符串中,否则没有可读性;名称中各单词间应有下划线或大小写变化,否则不便于读写。
本规则集合示例中出现的 foo、bar 等名称,意在代指一般的代码元素,仅作示例,实际代码中不应出现。
注意,不良命名方式甚至会导致标准未定义的行为,如:
extern int identifier_of_a_very_very_long_name_1;
extern int identifier_of_a_very_very_long_name_2; // Dangerous
如果两个名称有相同的前缀,当相同前缀超过一定长度时是危险的,可能会导致编译器无法有效区分相关名称。C 标准指明,保证名称前 31 位不同可避免这种问题。
不建议采用相同“长前缀”+ 不同“短后缀”的命名方式,这种名称非常容易造成笔误或复制粘贴错误,如:
struct Expr {
Expr* sub0; // Bad
Expr* sub1; // Bad
};
设 Expr 是某二元表达式类,sub0、sub1 为左右子表达式,这种命名方式应改进:
struct Expr {
Expr* left; // Better
Expr* right; // Better
};
配置
maxObjNameLength: 对象名称长度上限,超过则报出
maxFunNameLength: 函数名称长度上限,超过则报出
maxTypeNameLength: 类型名称长度上限,超过则报出
maxWordLength: 连续无大小写变化的字符数量上限,超过则报出
依据
ISO/IEC 9899:1999 5.2.4.1(1)
ISO/IEC 9899:1999 6.4.2.1(6)-undefined
ISO/IEC 9899:2011 5.2.4.1(1)
ISO/IEC 9899:2011 6.4.2.1(6)-undefined
参考
C++ Core Guidelines NL.19
C++ Core Guidelines ES.8
MISRA C 2004 5.1
MISRA C 2012 5.1
MISRA C 2012 5.2
MISRA C 2012 5.4
MISRA C 2012 5.5
MISRA C++ 2008 2-10-1