隐藏
Bill Yang 代码规范 | Bill Yang's Blog
0%

Bill Yang 代码规范

前言

本代码规范为笔者所用的 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
#include<bits/stdc++.h>

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];
#define ls index<<1
#define rs index<<1|1
//......
} st;

void Query(int Left,int Right) {
//......
}

int main() {
//......
return 0;
}

注:上述代码中宏未缩进为显示bug。

另,关于类与结构体中的成员函数,期间可以添加空行(提高可读性),也可以不添加空行(保证紧凑性),这里没有严格规范。

空格同样是用于提高代码可读性的。

正文与左大括号间添加空格。

比较:左小括号与左中括号前不添加空格。

严禁在代码中添加大量无意义空格与空行。

关于它们的使用,接下来的内容会详细描述。

头文件

1
2
3
#include<iostream>
#include<cstring>
#include<cstdio>

多个头文件需要根据头文件的长度进行降序或升序排列(一般使用降序排列)

C++的代码在没有必要时,不使用.h结尾的头文件。
C的代码在没有必要时,不使用c开头的头文件。

C++的代码推荐使用以下代码引用头文件:

1
#include<bits/stdc++.h>

除上面一段以外,不推荐调用没有使用的头文件。

头文件间不添加空行与空格

宏与别名定义

一般,将宏与别名定义在头文件的下方,代码正文的上方。
全局宏与非自定义宏,请遵循上述原则。
特殊情况:

  1. 仅在某个代码块使用到的宏与别名,可以在代码块上部定义,位于代码块正文上方,代码块变量定义下方。
  2. 条件编译开关等编译相关宏不遵循以上原则,若无必要的位置,尽量置于头文件上方。

在代码块中的宏,保持代码缩进
宏与别的代码块间,添加空行。

如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#define OnlineJudge

#include<bits/stdc++.h>

#define maxn 10005

using namespace std;

struct Balance_Tree {
struct Tree {
//...
} tree[maxn];
#define ls tree[x].child[0]
#define rs tree[x].child[1]
//...
};

int main() {
#ifdef DEBUG
puts("debugging");
#endif
return 0;
}

代码块及命名空间

支持的代码块格式有以下两种:

1
2
3
{
//这是代码缩进
}

1
{puts("...");} //这里没有缩进

使用命名空间的时候,在使用的代码块前添加:

1
using namespace xxx;

特别地,在使用std的时候,将代码提前到头文件后,宏定义与变量定义前。

在编写命名空间时,添加左括号前的空格与代码缩进。

1
2
3
4
5
namespace name1 {
//这是代码缩进
}

using namespace name1;

命名空间应遵循黑箱原则,即:命名空间所使用的变量与常量均应在命名空间内定义,命名空间使用到的外部量只能通过传参方式完成。

命名空间内应与命名空间外遵循同样的原则。

结构体/类

在OI中,我们常常使用结构体实现简易类。

遵循黑箱原则。

结构体类似命名空间,特别的,结构体内的成员函数间可不添加空行。

类中包含的publicprivate等关键词应保持缩进,与成员变量或函数间不添加空行,但在不同的关键词间应保持空行,如:

1
2
3
4
5
6
7
8
9
10
11
class Student {
private:
string name;
int age;

public:
string getName() {return name;}

private:
void increaseAge() {age++;}
};

关于重载,在符号前后添加空格,尽量使用常量引用传参,如下:

1
2
3
4
5
Matrix operator + (const Matrix &b) {
Matrix c=*this;
//...
return c;
}

引用符&

&一般添加在变量名前:

1
int &x=y;

传参

传参可使用三种方式传参,格式分别如下:

1
2
3
void hello(int x,int y);
void hello(int &x,int &y);
void hello(const int &x,const int &y);

逗号前后不添加空格。

函数

void函数需要保证函数必定有退出出口,即该函数在任意情况下都能退出。

函数的两种格式如下:

1
2
3
4
5
int hello() {return 0;}
int hello(int x) {
if(x)return 1;
else return 0;
}

if-else嵌套

保持代码缩进。
大括号与正文间添加空格。

1
2
3
4
5
6
7
if(i==1) {

} else if(i==2) {

} else {

}

另一种格式:

1
2
3
4
5
6
if(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
6
for(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
3
while(x) {
//...
}

如果想到新内容还会更新的。

姥爷们赏瓶冰阔落吧~