空行的使用 |
空行起着分隔程序段落的作用。空行得体(不过多也不过少)将使程序的布局更加清晰。空行不会浪费内存,虽然打印含有空行的程序是会多消耗一些纸张,但是值得。所以不要舍不得用空行。
- 在每个类声明之后、每个函数定义结束之后都要加2行空行。
- 在一个函数体内,逻揖上密切相关的语句之间不加空行,其它地方应加空行分隔。
|
语句与代码行 |
- 一行代码只做一件事情,如只定义一个变量,或只写一条语句。这样的代码容易阅读,并且方便于写注释。
- "if"、"for"、"while"、"do"、"try"、"catch" 等语句自占一行,执行语句不得紧跟其后。不论执行语句有多少都要加 "{ }" 。这样可以防止书写失误。
|
缩进和对齐 |
- 程序的分界符 "{" 和 "}" 应独占一行并且位于同一列,同时与引用它们的语句左对齐。
- "{ }" 之内的代码块在 "{" 右边一个制表符(4个半空格符)处左对齐。如果出现嵌套的 "{ }",则使用缩进对齐。
- 如果一条语句会对其后的多条语句产生影响的话,应该只对该语句做半缩进(2个半角空格符),以突出该语句。
例如:
void Function(int x) { CSessionLock iLock(*m_psemLock);
for (初始化; 终止条件; 更新) { // ... }
try { // ... } catch (const exception& err) { // ... } catch (...) { // ... }
// ... } |
|
最大长度 |
代码行最大长度宜控制在70至80个字符以内。代码行不要过长,否则眼睛看不过来,也不便于打印。 |
长行拆分 |
长表达式要在低优先级操作符处拆分成新行,操作符放在新行之首(以便突出操作符)。拆分出的新行要进行适当的缩进,使排版整齐,语句可读。 例如:
if ((very_longer_variable1 >= very_longer_variable2) && (very_longer_variable3 <= very_longer_variable4) && (very_longer_variable5 <= very_longer_variable6)) { dosomething(); } |
|
空格的使用 |
- 关键字之后要留空格。象 "const"、"virtual"、"inline"、"case" 等关键字之后至少要留一个空格,否则无法辨析关键字。象 "if"、"for"、"while"、"catch" 等关键字之后应留一个空格再跟左括号 "(",以突出关键字。
- 函数名之后不要留空格,紧跟左括号 "(" ,以与关键字区别。
- "(" 向后紧跟。而 ")"、","、";" 向前紧跟,紧跟处不留空格。
- "," 之后要留空格,如 Function(x, y, z)。如果 ";" 不是一行的结束符号,其后要留空格,如 for (initialization; condition; update)。
- 赋值操作符、比较操作符、算术操作符、逻辑操作符、位域操作符,如"="、"+=" ">="、"<="、"+"、"*"、"%"、"&&"、"||"、"<<", "^" 等二元操作符的前后应当加空格。
- 一元操作符如 "!"、"~"、"++"、"--"、"&"(地址运算符)等前后不加空格。
- 象"[]"、"."、"->"这类操作符前后不加空格。
- 对于表达式比较长的for、do、while、switch语句和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=a<b?a:b; // 不好的风格
// =========================================================== int* x = &y; // 良好的风格 int * x = & y; // 不良的风格
// =========================================================== array[5] = 0; // 不要写成 array [ 5 ] = 0; a.Function(); // 不要写成 a . Function(); b->Function(); // 不要写成 b -> Function(); |
|
修饰符的位置 |
- 为便于理解,应当将修饰符 "*" 和 "&" 紧靠数据类型。
例如:
char* name;
int* x, y; // 为避免y被误解为指针,这里必须分行写。
int* Function(void* p); |
参见:变量、常量的风格与版式 -> 指针或引用类型的定义和声明
|
注释 |
- 注释的位置应与被描述的代码相邻,可以放在代码的上方或右方,不可放在下方。
- 边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。不再有用的注释要删除。
- 注释应当准确、易懂,防止注释有二义性。错误的注释不但无益反而有害。
- 当代码比较长,特别是有多重嵌套时,应当在一些段落的结束处加注释,便于阅读。
|
与常量的比较 |
在与宏、常量进行 "==", "!=", ">=", "<=" 等比较运算时,应当将常量写在运算符左边,而变量写在运算符右边。这样可以避免因为偶然写错把比较运算变成了赋值运算的问题。 例如:
if (NULL == p) // 如果把 "==" 错打成 "=",编译器就会报错 { // ... } |
|
为增强代码的可读性而定义的宏 |
以下预定义宏对程序的编译没有任何影响,只为了增加代码的可读性:
宏 |
说明 |
NOTE |
需要注意的代码 |
TODO |
尚未实现的接口、类、算法等 |
FOR_DBG |
标记为调试方便而临时增加的代码 |
OK |
仅用于调试的标记 |
例如:
TODO class CMyClass; TODO void Function(void);
FOR_DBG cout << "..."; |
|