联众公司开发部文档《联众公司C++/C代码编写规范》
\\******************************************************************/
? 在头文件中数据成员和函数成员都要加简短的说明,在cpp文件中每一个函数都要详细
的说明函数的功能描述、使用方法、参数、输入、输出、返回值、限制条件、注意事项、修改记录。
/****************************************************************** 名字:
参数1:输出 参数2:输入 参数n:输入 返回值: 注意:
修改记录----------------------------------------------------------- 修改:(日期) (姓名) (内容) 检查:(日期) (姓名) (内容)
******************************************************************/
3.10 文件名字
? 文件名要能表示它所实现的类的名字,一般是将类的名字去掉最前面的字母C 例如:
类CBoard的文件名:Board.h Board.cpp
4. 代码书写格式规范
4.1 代码的书写力求是描述性的
? 尽量书写描述性的代码,清晰易读,不要写晦涩的代码让人费解
4.2 花括号{}的使用
? 花括号要单独站一行,并且开始和结束的要在同一列,花括号中间的内容要向右缩格,
例如:
void Function(void) {
if( condition ) {
... }
— 11 —
联众公司开发部文档《联众公司C++/C代码编写规范》
else {
... }
switch( value ) {
case 1 : ...
break ; case 2 : ...
break ; default :
break ; } }
4.3 代码行
? 一行代码只做一件事情,如只定义一个变量,或只写一条语句。这样的代码容易阅读,
并且方便于写注释。
? if、for、while、do等语句自占一行,执行语句不得紧跟其后。不论执行语句有多少
都要加{}。这样可以防止书写失误和风格的统一。 示例: 良好的代码风格 不好的代码风格 int width=0; // 宽度 int width, height, depth; // 宽int height=0; // 高度 度高度深度 int depth=0; // 深度 x = a + b; X = a + b; y = c + d; z = e y = c + d; + f; z = e + f; if (width < height) if (width < height) { dosomething(); dosomething(); } for (initialization; for (initialization; condition; update) condition; update) { dosomething(); dosomething(); other(); } // 空行 other(); ? 尽可能在定义变量的同时初始化该变量, 如果变量的引用处和其定义处相隔比较远,变
量的初始化很容易被忘记。如果引用了未被初始化的变量,可能会导致程序错误.
— 12 —
联众公司开发部文档《联众公司C++/C代码编写规范》
4.4 空格的使用
? 关键字之后要留空格。象const、virtual、inline、case 等关键字之后至少要留
一个空格,否则无法辨析关键字。象if、for、while等关键字之后应留一个空格再跟左括号‘(’,以突出关键字。
? 函数名之后不要留空格,紧跟左括号‘(’,以与关键字区别 ? ‘(’向后紧跟,‘)’、‘,’、‘;’向前紧跟,紧跟处不留空格 ? ‘,’之后要留空格,如Function(x, y, z)。如果‘;’不是一行的结束符号,其
后要留空格,如for (initialization; condition; update) ? 赋值操作符、比较操作符、算术操作符、逻辑操作符、位域操作符,如“=”、“+=” “>=”、
“<=”、“+”、“*”、“%”、“&&”、“||”、“<<”,“^”等二元操作符的前后应当加空格 ? 一元操作符如“!”、“~”、“++”、“--”、“&”(地址运算符)等前后不加空格 ? 象“[]”、“.”、“->”这类操作符前后不加空格 ? 对于表达式比较长的for语句和if语句,为了紧凑起见可以适当地去掉一些空格,如
for (i=0; i<10; i++)和if ((a<=b) && (c<=d))
void Func1(int x, int y, int z); // 良好的风格 void Func1 (int x,int y,int z); // 不良的风格 if (year >= 2000) // 良好的风格 if(year>=2000) // 不良的风格 if ((a>=b) && (c<=d)) // 良好的风格 if(a>=b&&c<=d) // 不良的风格 for (i=0; i<10; i++) // 良好的风格 for(i=0;i<10;i++) // 不良的风格 for (i = 0; I < 10; i ++) // 过多的空格 x = a < b ? a : b; // 良好的风格 x=aFunction(); // 不要写成 b -> Function();
4.5 空行的使用
? 在每个类声明之后、每个函数定义结束之后都要加空行。
? 在一个函数体内,逻揖上密切相关的语句之间不加空行,其它地方应加空行分隔。
示例: // 空行 // 空行 void Function1(…) while (condition) { { … statement1; } // 空行 // 空行 if (condition) — 13 —
联众公司开发部文档《联众公司C++/C代码编写规范》
void Function2(…) { … } // 空行 void Function3(…) { … }
{ statement2; } else { statement3; } // 空行 statement4; } 4.6 小括号 () 的使用
? 复杂的表达式最好用()来代替以运算符的优先级来决定的执行顺序,即便是写程序的
人记得清优先级,也要考虑程序对别人的可读性。
4.7 注释的使用
? 注释是对代码的“提示”,而不是文档。程序中的注释不可喧宾夺主,注释太多了会让
人眼花缭乱。注释的花样要少。
? 使用C++风格的注释“//”代替C风格的注释“/* ...*/”,类和函数的大段说明除外。 ? 代码中的注释:
在代码中加注释本着少而精的原则,并非注释越多越好,原则是其他人读代码时步不觉得注释繁琐、也不需要太多的推理来判断程序的功能、也不觉得程序晦涩难以明白。 ? 类的定义的注释:在类的顶部说明类的功能和使用方法, 见3.9 ? 类的实现的定义:见3.9
在类的定义头文件中每一个变量和函数都应该简要说明他们的功用,在cpp文件中要详细说明函数的功能、使用方法、参数、返回值、限制条件、注意事项。 ? 推荐注释和被注释的代码左对齐。
? 注释总是在被注释的代码的上方或右方,不要写在被注释代码行的下面。 ? 注释一定要正确,修改代码必须要重新审查并修改注释,错误的注释还比没有注释更有
害。
4.8 长行拆分
? 代码行最大长度宜控制在80个字符以内。代码行不要过长,否则眼睛看不过来,也不
便于打印。
? 长表达式要在低优先级操作符处拆分成新行,操作符放在新行之首(以便突出操作符)。
拆分出的新行要进行适当的缩进,使排版整齐,语句可读。 if ((very_longer_variable1 >= very_longer_variable12) && (very_longer_variable3 <= very_longer_variable14) && (very_longer_variable5 <= very_longer_variable16)) { — 14 —
联众公司开发部文档《联众公司C++/C代码编写规范》
dosomething(); } virtual CMatrix CMultiplyMatrix (CMatrix leftMatrix, CMatrix rightMatrix); for (very_longer_initialization; very_longer_condition; very_longer_update) { dosomething(); } 4.9 修饰符* &的位置
? 为了避免误解规定修饰符*和&都靠变量名
例如: int i1, i2, i3, *pi1, *pi2, &iR1=i1, &iR3=i3; pi1 = &i1; pi2 = &i2; i1 = 1; i2 = 2; i3 = 3;
4.10 注意代码中不要误写全角字符
? 代码中误写了全角字符编译固然不会通过,找问题未必容易,比如说写了全角的空格、
逗号、分号等
5. 函数设计
5.1 通用规则
? 函数的功能要单一,不要设计大而全的多用途的函数。
例如微软下面的函数,天晓得有几个人彻底使用过它的功能: HANDLE CreateFile(
LPCTSTR lpFileName, // file name DWORD dwDesiredAccess, // access mode DWORD dwShareMode, // share mode
LPSECURITY_ATTRIBUTES lpSecurityAttributes, // SD DWORD dwCreationDisposition, // how to create DWORD dwFlagsAndAttributes, // file attributes
HANDLE hTemplateFile // handle to template file
— 15 —