前言
本代码规范为笔者所用的 C/C++ 代码编写格式规范,参考了 Java 的代码标准排版模式,并总结于此。
换行与空格
笔者习惯在两段意义不同的代码块间进行换行。
并遵循不随意添加空行的原则。
如在头文件与宏与using段间添加空行,在函数间添加空行。
以下是范例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
using namespace std;
typedef unsigned int LL;
inline LL Get_Int() {
LL num=0,bj=1;
char x=getchar();
while(!isdigit(x)) {if(x=='-')bj=-1;x=getchar();}
while(isdigit(x)) {num=num*10+x-'0';x=getchar();}
return num*bj;
}
const int maxn=50005,K=31;
struct Linear_Bases {
//......
} null;
int n,q;
LL a[maxn];
struct Segment_Tree {
struct Tree {
int left,right;
Linear_Bases lb;
} tree[maxn<<2];
//......
} st;
void Query(int Left,int Right) {
//......
}
int main() {
//......
return 0;
}
注:上述代码中宏未缩进为显示bug。
另,关于类与结构体中的成员函数,期间可以添加空行(提高可读性),也可以不添加空行(保证紧凑性),这里没有严格规范。
空格同样是用于提高代码可读性的。
正文与左大括号间添加空格。
比较:左小括号与左中括号前不添加空格。
严禁在代码中添加大量无意义空格与空行。
关于它们的使用,接下来的内容会详细描述。
头文件
1 |
多个头文件需要根据头文件的长度进行降序或升序排列(一般使用降序排列)
C++的代码在没有必要时,不使用.h结尾的头文件。
C的代码在没有必要时,不使用c开头的头文件。
C++的代码推荐使用以下代码引用头文件:1
除上面一段以外,不推荐调用没有使用的头文件。
头文件间不添加空行与空格
宏与别名定义
一般,将宏与别名定义在头文件的下方,代码正文的上方。
全局宏与非自定义宏,请遵循上述原则。
特殊情况:
- 仅在某个代码块使用到的宏与别名,可以在代码块上部定义,位于代码块正文上方,代码块变量定义下方。
- 条件编译开关等编译相关宏不遵循以上原则,若无必要的位置,尽量置于头文件上方。
在代码块中的宏,保持代码缩进。
宏与别的代码块间,添加空行。
如:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using namespace std;
struct Balance_Tree {
struct Tree {
//...
} tree[maxn];
//...
};
int main() {
puts("debugging");
return 0;
}
代码块及命名空间
支持的代码块格式有以下两种:1
2
3{
//这是代码缩进
}
1 | {puts("...");} //这里没有缩进 |
使用命名空间的时候,在使用的代码块前添加:1
using namespace xxx;
特别地,在使用std的时候,将代码提前到头文件后,宏定义与变量定义前。
在编写命名空间时,添加左括号前的空格与代码缩进。1
2
3
4
5namespace name1 {
//这是代码缩进
}
using namespace name1;
命名空间应遵循黑箱原则,即:命名空间所使用的变量与常量均应在命名空间内定义,命名空间使用到的外部量只能通过传参方式完成。
命名空间内应与命名空间外遵循同样的原则。
结构体/类
在OI中,我们常常使用结构体实现简易类。
遵循黑箱原则。
结构体类似命名空间,特别的,结构体内的成员函数间可不添加空行。
类中包含的public,private等关键词应保持缩进,与成员变量或函数间不添加空行,但在不同的关键词间应保持空行,如:1
2
3
4
5
6
7
8
9
10
11class Student {
private:
string name;
int age;
public:
string getName() {return name;}
private:
void increaseAge() {age++;}
};
关于重载,在符号前后添加空格,尽量使用常量引用传参,如下:1
2
3
4
5Matrix operator + (const Matrix &b) {
Matrix c=*this;
//...
return c;
}
引用符&
&一般添加在变量名前:1
int &x=y;
传参
传参可使用三种方式传参,格式分别如下:1
2
3void hello(int x,int y);
void hello(int &x,int &y);
void hello(const int &x,const int &y);
逗号前后不添加空格。
函数
非void函数需要保证函数必定有退出出口,即该函数在任意情况下都能退出。
函数的两种格式如下:1
2
3
4
5int hello() {return 0;}
int hello(int x) {
if(x)return 1;
else return 0;
}
if-else嵌套
保持代码缩进。
大括号与正文间添加空格。1
2
3
4
5
6
7if(i==1) {
} else if(i==2) {
} else {
}
另一种格式:1
2
3
4
5
6if(i==1)puts("1");
else if(i==2)puts("2");
else if(i==3) {
puts("3");
return;
} else puts("4");
循环
for循环
在分号之后添加一个空格,不添加其他任何空格。1
2
3
4
5
6for(int i=1; i<=n; i++) {}
for(int i=1; i<=n; i++,x++) {
//...
}
for(; i<=n; i++) {}
for(; i<=n; ) {}
若仅有限制条件的循环,不建议使用for循环。
while循环
不添加多余空格。1
2
3while(x) {
//...
}
如果想到新内容还会更新的。