Leaves's Code Style for OI

本文介绍Leaves遵循的代码规范。这是一种基于Google Code Style的代码规范。

如对某项的目的或含义有不理解的地方请留言。

1.命名约定

1.1 通用命名规则

尽可能少用缩写,要有描述性。除非是一些广为人知的缩写。

1.2 文件命名

文件名要全部小写, 可以包含下划线 (_)。

1.3 类型命名

类, 结构体, 类型定义 (typedef), 枚举, 类型模板参数名称的每个单词首字母均大写, 不包含下划线。

1.4 变量命名

变量 (包括函数参数) 和数据成员名一律小写, 单词之间用下划线连接. 类的成员变量以下划线结尾, 但结构体的就不用, 如: alocal_variable, a_struct_data_member, a_class_data_member.

1.5 常量命名

命名时以 “k” 开头,大小写混合。

1.6 函数命名

常规函数使用大小写混合, 取值和设值函数则要求与变量名匹配。


2.类

2.1 类和结构体

struct仅包含成员变量、构造函数、析构函数,其它一概使用 class。为了和 STL 保持一致,对于仿函数等特性可以使用struct。

2.2 运算符重载

尽可能不要重载运算符。 禁止创建用户定义字面量。

2.3 声明顺序

类定义一般应以 public: 开始, 后跟 private:
在每一部分中,按如下顺序申明:构造函数,析构函数,重载运算符,其它函数,成员变量。


3.格式

大括号换行不换行均可,因为本人大括号不换行,下面的例子大括号均不换行。

3.1 行长度

每一行代码字符数不超过80。

3.2 缩进

把Tab改成两格空格缩进。

3.3 函数的声明定义调用

返回类型和函数名在同一行, 参数也尽量放在同一行, 如果放不下就对形参分行。
说明:
参数不换行:

1
2
3
4
ReturnType ClassName::FunctionName(Type par_name1, Type par_name2) {
DoSomething();
...
}

参数换行:

1
2
3
4
5
ReturnType ClassName::FunctionName(Type par_name1, Type par_name2,
Type par_name3) {
DoSomething();
...
}

参数换行’:

1
2
3
4
5
6
7
ReturnType LongClassName::ReallyReallyReallyLongFunctionName(
Type par_name1, // 4 space indent
Type par_name2,
Type par_name3) {
DoSomething(); // 2 space indent
...
}

3.4 IF语句

  • 倾向于不在圆括号内使用空格。 关键字 if 和 else 另起一行。
  • if 和左圆括号间都有空格。右圆括号和左大括号之间有空格。
  • 当且仅当语句简单并且没有使用 else 子句时,可以将代码写在一行。
  • 单行语句不需要使用大括号,如果你喜欢用也没问题。
  • 语句中某个 if-else 分支使用了大括号的话,其它分支也必须使用。

允许的:

1
2
3
4
5
6
7
8
9
10
11
12
13
if (condition) {
... // 2 空格缩进.
} else if (...) {
...
} else {
...
}
if (x == kFoo) return new Foo();
if (condition) {
foo;
} else {
bar;
}

不允许的:

1
2
3
4
5
6
7
8
if (condition){ // 缺少空格
if (x) DoThis(); // 有else但是没有换行
else DoThat();
if (condition) // else有大括号但是if没有
foo;
else {
bar;
}

3.5 选择语句

格式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
switch (var) {
case 0: { // 2 空格缩进
... // 4 空格缩进
break;
}
case 1: {
...
break;
}
default: {
assert(false);
}
}

3.6 循环语句

  • 在单语句循环里,括号可用可不用。
  • 空循环体应使用 {} 或 continue,而不是一个简单的分号。

3.7 指针和引用表达式

点或箭头前后不要有空格。指针/地址操作符 (*, &) 之后不能有空格。

3.8 布尔表达式

  • 如果一个布尔表达式超过 标准行宽,需要断行。
  • 逻辑与 (&&) 操作符总位于行尾。
  • 直接用符号形式的操作符,如 && 和 ~,不要用词语形式的 and 和 compl。

3.9 函数返回值

不要在 return 表达式里加上非必须的圆括号.

3.10 类格式

依次申明 public:, private:
每个关键词都缩进 1 个空格。关键词前空一行。
栗子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class MyClass {
public: // 注意有一个空格的缩进
MyClass(); // 标准的两空格缩进
explicit MyClass(int var);
~MyClass() {}
void SomeFunction();
void SomeFunctionThatDoesNothing() {
}
void set_some_var(int var) { some_var_ = var; }
int some_var() const { return some_var_; }
private:
bool SomeInternalFunction();
int some_var_;
int some_other_var_;
};

3.11 构造函数初始值列表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 如果所有变量能放在同一行:
MyClass::MyClass(int var) : some_var_(var) {
DoSomething();
}
// 如果不能放在同一行,
// 必须置于冒号后, 并缩进 4 个空格
MyClass::MyClass(int var)
: some_var_(var), some_other_var_(var + 1) {
DoSomething();
}
// 如果初始化列表需要置于多行, 将每一个成员放在单独的一行
// 并逐行对齐
MyClass::MyClass(int var)
: some_var_(var), // 4 space indent
some_other_var_(var + 1) { // lined up
DoSomething();
}
// 右大括号 } 可以和左大括号 { 放在同一行
// 如果这样做合适的话
MyClass::MyClass(int var)
: some_var_(var) {}

3.12 水平留白

永远不要在行尾添加没意义的留白.
通用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void f(bool b) { // 左大括号前总是有空格.
...
int i = 0; // 分号前不加空格.
// 列表初始化中大括号内的空格是可选的.
// 如果加了空格, 那么两边都要加上.
int x[] = { 0 };
int x[] = {0};
class Foo : {
public:
// 对于单行函数的实现, 在大括号内加上空格
// 然后是函数实现
Foo(int b) : Bar(), baz_(b) {} // 大括号里面是空的话, 不加空格.
void Reset() { baz_ = 0; } // 用括号把大括号与实现分开.
...

循环和条件语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
if (b) { // if 条件语句和循环语句关键字后均有空格.
} else { // else 前后有空格.
}
while (test) {} // 圆括号内部不紧邻空格.
switch (i) {
for (int i = 0; i < 5; ++i) {
switch ( i ) { // 循环和条件语句的圆括号里可以与空格紧邻.
if ( test ) { // 圆括号, 但这很少见. 总之要一致.
for ( int i = 0; i < 5; ++i ) {
for ( ; i < 5 ; ++i) { // 循环里内 ; 后恒有空格, ; 前可以加个空格.
switch (i) {
case 1: // switch case 的冒号前无空格.
...
case 2: break; // 如果冒号有代码, 加个空格.

操作符

1
2
3
4
5
6
7
8
9
10
// 赋值运算符前后总是有空格.
x = 0;
// 其它二元操作符也前后恒有空格, 不过对于表达式的子式可以不加空格.
// 圆括号内部没有紧邻空格.
v = w * x + y / z;
v = w*x + y/z;
v = w * (x + z);
// 在参数和一元操作符之间不加空格.
x = -5;
++x;

3.13 垂直留白

垂直留白越少越好。


4 其他

  • 尽可能不使用 using namespace std; 和 #include
  • 尽可能将算法和数据结构用class封装

版权声明: 本博客所有文章除特别声明外,均采用CC BY-NC-SA 4.0 许可协议。转载请注明出处!

~感谢投食~