1.排版
1-1:程序块要采用缩进风格编写,缩进为一个Tab。
说明:对于由开发工具自动生成的代码可以有不一致。
1-2:相对独立的程序块之间、变量说明之后必须加空行。
示例:如下例子不符合规范。
if (!valid_ni(ni))
{
... // program code
}
repssn_ind = ssn_data[index].repssn_index;
repssn_ni = ssn_data[index].ni;
应如下书写
if (!valid_ni(ni))
{
... // program code
}
repssn_ind = ssn_data[index].repssn_index;
repssn_ni = ssn_data[index].ni;
1-3:较长的语句(>80字符)要分成多行书写,长表达式要在低优先级操作符处划分新行,
操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读。
1-4:循环、判断等语句中若有较长的表达式或语句,则要进行适应的划分,长表达式要在低
优先级操作符处划分新行,操作符放在新行之首。
1-5:若函数或过程中的参数较长,则要进行适当的划分。
1-6:不把多个短语句写在一行中,即一行只写一条语句。
示例:如下例子不符合规范。
rect.length = 0; rect.width = 0;
应如下书写
rect.length = 0;
rect.width = 0;
1-7:if、 for、 do、 while、 case、 switch、 default等语句自占一行,且if、 for、
do、 while等语句的执行语句部分无论多少都要加括号{}。
1-8:对齐使用Tab
1-9:函数或过程的开始、结构的定义及循环、判断等语句中的代码都要采用缩进风格, case 语句下的情况处理语句也要遵从语句缩进要求。
1-10:程序块的分界符(如C/C++语言的大括号‘{’和‘}’)应各独占一行并且位于同一列,同时与引用它们的语句左对齐。在函数体的开始、类的定义、结构的定义、枚举的定义以及if、 for、do、while、switch、case语句中的程序都要采用如上的缩进方式。
示例:如下例子不符合规范。
for (...) {
... // program code
}
if (...)
{
... // program code
}
应如下书写
for (...)
{
... // program code
}
if (...)
{
... // program code
}
1-11:在两个以上的关键字、变量、常量进行对等操作时,它们之间的操作符之前、之后或者前后要加空格;进行非对等操作时,如果是关系密切的立即操作符(如->),后不应加空格。
(1) 逗号、分号只在后面加空格。
(2)比较操作符, 赋值操作符"="、"+=",算术操作符"+"、"%",逻辑操作符"&&"、"&",位域操作符"<<"、 "^"等双目操作符的前后加空格。
(3)"!"、 "~"、 "++"、 "--"、 "&"(地址运算符)等单目操作符前后不加空格。
(4)"->"、 "."前后不加空格。
2.注释
2-1:适当添加注释,注释不宜太多也不能太少,注释语言必须准确、易懂、简洁。
2-2:函数头部应进行注释,列出:函数的目的/功能、输入参数、输出参数、返回值、调用关系(函数、表)等。
2-3:边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。不再有用的注释要删除。
2-4:避免在注释中使用缩写
2-5:注释应与其描述的代码相近,对代码的注释应放在其上方或右方(对单条语句的注释)相邻位置,不可放在下面,如放于上方则需与其上面的代码用空行隔开。
2-6:避免在一行代码或表达式的中间插入注释。
3.命名约定
3-1:类命名:大驼峰式命名法(upper camel case)
类名以大写字母开头,不包含下划线: MyExcitingClass、 MyExcitingEnum。所有类、结构体、类型定义(typedef)、枚举—均使用相同约定。
例如:
// classes and structs
class UrlTable { ...
class UrlTableTester { ...
struct UrlTableProperties { ...
// typedefs
typedef hash_map<UrlTableProperties *, string> PropertiesMap;
// enums
enum UrlTableErrors { ..
类成员以m_开头,后使用小驼峰式命名法,如: m_charNum, m_phraseLen
类方法使用遵循小驼峰式命名法,第一个单词以小写字母开始,第二个单词开始首字母大写。如:getCharNum(), getWordNum()
3-2:变量命名:小驼峰式命名法(lower camel case)
第一个单词以小写字母开始,第二个单词的首字母大写。例如:firstName、lastName。
3-3:函数命名:大驼峰式命名法
每个单词首字母大写。如:MyExcitingFunction()、MyExcitingMethod()
3-4:命名中若使用特殊约定或缩写,则要有注释说明。
3-5:对于变量命名,禁止取单个字符(如i、j、k...),建议除了要有具体含义外,还能表明其变量类型、数据类型等,但i、 j、 k作局部循环变量是允许的。
3-6:除非必要,不要用数字或较奇怪的字符来定义标识符。
4.可读性
4-1:注意运算符的优先级,并用括号明确表达式的操作顺序, 防止阅读程序时产生误解
//示例:下列语句中的表达式
word = (high << 8) | low (1)
if ((a | b) && (a & c)) (2)
if ((a | b) < (c & d)) (3)
//如果书写为
high << 8 | low
a | b && a & c
a | b < c & d
//由于
high << 8 | low = ( high << 8) | low,
a | b && a & c = (a | b) && (a & c),
//(1)(2)不会出错,但语句不易理解;
//a | b < c & d = a | (b < c) & d, (3)造成了判断条件出错。
4-2:避免使用不易理解的数字,用有意义的标识来替代。涉及物理状态或者含有物理意义的常量,不应直接使用数字,必须用有意义的枚举或宏来代替。
不要使用难懂的技巧性很高的语句,除非很有必要时
示例:如下表达式,考虑不周就可能出问题,也较难理解。
* stat_poi ++ += 1;
* ++ stat_poi += 1;
应分别改为如下。
*stat_poi += 1;
stat_poi++; // 此二语句功能相当于“ * stat_poi ++ += 1;
++ stat_poi;
*stat_poi += 1; // 此二语句功能相当于“ * ++ stat_poi += 1;
5.程序效率
8-1:编程时要经常注意代码的效率
8-2:在保证软件系统的正确性、稳定性、可读性及可测性的前提下,提高代码效率。
8-3:局部效率应为全局效率服务,不能因为提高局部效率而对全局效率造成影响。
8-3:在传参时,如果传的数据较大,为避免进行数据拷贝的消耗,可以考虑使用引用或指针。
8-4:考虑采用更优的算法代替较差的算法,例如:在一些情况下,可以考虑用快排代替冒泡排序。
6.质量保证
9-1:只引用属于自己的存贮空间。
9-2:防止引用已经释放的内存空间。
9-3:函数中分配的内存,函数退出之前要释放。
9-4:过程/函数中申请的(为打开文件而使用的)文件句柄,在过程/函数退出之前要关闭。
9-5:防止内存操作越界。
9-6:编程时,要防止差1错误。
说明:此类错误一般是由于把“<=”误写成“<”或“>=”误写成“>”等造成的,由此
引起的后果,很多情况下是很严重的,所以编程时,一定要在这些地方小心。当编完程序后,应对这些操作符进行彻底检查。
9-7:不用goto语句。
说明: goto 语句会破坏程序的结构性,所以除非确实需要,最好不使用 goto 语句。
9-8:注意功能的独立封装
方便单元测试和将来的代码复用