1.行长度
每一行代码字符数不超过80
结论:80个字符是最大值。例外:
1)如果一行注释包含了超过80个字符的,命令或者URL,出于复制粘贴的方便可以超过80个
2)头文件保护
2.非ASCII字符
尽量不要使用非ASCII字符,使用时必须使用UTF-8格式
3.空格还是制表位
只使用空格,每次缩进2个空格
可以设定编辑器将tab转为空格
4.函数声明与定义
返回类型和函数名在同一行,合适的话,参数也放在同一行
以下几点:
1)返回值和函数名总是在同一行
2)左圆括号总是核函数名在同一行
3)函数名和左圆括号间没有空格
4)圆括号和参数间没有空格
5)左大括号总是在最后一个参数同一行的末尾处
6)右大括号总是单独位于函数最后一行
7)右圆括号和左大括号之间总是有一个空格
8)函数声明和实现处的所有形参名称必须保持一致
9)所有形参应该尽可能对齐
10)缺省缩进为2个空格
11)独立封装的参数保持4个空格的缩进
5.函数调用
尽量放在同一行,否则,将实参封装在圆括号中。
同一行放不下,可断为多行,后面每一行都和第一个实参对齐,左圆括号和右圆括号前不要留空格:
bool retval = DoSomething(argument1,
argument2,
argument3);
or
if{
if{
DoSomethingThatRequiresALongFunctionName(
very_long_argumrnt1,
argument2,
argument3
);
}
}
6.条件语句
更提倡不在圆括号中添加空格,关键字else另起一行。
圆括号和大括号最好空一格
if(condition) {...
有些语句放在一行,增强可读性
if(x) DoThis();
通常单行语句不要使用大括号
7.循环和开关选择语句
switch语句可以使用大括号分块;空循环提应使用{}或continue,不要只是一个建立单的分号。
switch语句中的case块可以使用大括号也可以不用,如果输入的值没有case去处理,编译器将会报警,因此添加default,若default永不会执行,可以简单地使用assert:
default:{
assert(false); //assert判断为假中断程序执行
}
8.指针和引用表达式
句点(.)或箭头(->)前后不要有空格,指针/地址操作符(*, &)后不要有空格
9.布尔表达式
如果一个布尔表达式超过标准行宽(80字符),如果断行要统一
10.函数返回值
return表达式中不要使用圆括号
11.变量及数组初始化
选择=还是()。都可以
12.预处理指令
预处理指令不要缩进,从行首开始(即使预处理指令在缩进的代码块中)
if(condition){
if DISASTER_PENDING
...
endif
...
}
13.类格式
声明属性依次是public、protected、private。每次缩进一个空格。
class MyClass{
public:
...
}
注意:
1)所有基类名应在80列限制下尽量与子类名放在同一行
2)关键词public 。。。 要缩进1个空格(MSVC所使用tab缩进,且这三个关键词不缩进)
3)除了第一个关键词之外,其他关键词前空一行。类小的话可以不空
4)这些关键词之后不要空行
14.初始化列表
构造函数初始化列表放在同一行或按四格缩进并排几行
MyClass::MyClass(int var):some_var_(var), some_other_var_(var + 1){
或者
MyClass::MyClass(int var)
:some_var_(var),
some_other_var_(var + 1){
15.命名空间格式化
命名空间内容不要缩进。
namespace{
void foo() {
}
}
16.水平空白
水平空白的使用因地制宜,不要在行尾提那家无谓的空白
17.垂直空白
垂直空白越少越好
总结:
1)行宽原则上不超过80列
2)尽量不要使用ASCII字符,要用的话,参考UTF-8格式,尤其在linux、unix下。尽量不要将字符串常量耦合到代码中,比如可以独立出资源文件
3)UNIX/Linux无条件使用空格,MSVC的话使用tab也无可厚非
4)函数参数,逻辑条件、初始化列表:要么所有参数和函数名放在同一行,要么所有参数并排分行
5)除函数定义的左大括号可以置于行首外,包括函数、类、结构体、枚举声明。各种语句的左大括号置于行尾,所有右大括号独立成行
6).or->操作符前后不留空,*or&不要前后都留空,一个就可,靠左靠右依个人爱好
7)预处理和命名空间不要使用额外缩进,类、结构体、枚举。函数。语句使用缩进
8)初始化=还是()都可以
9)return不要加()
10)水平,垂直留白不要滥用,怎么易读怎么来