介绍szTom在C++中使用的代码风格
头文件
必须使用using namespace std;
如果是C头文件,必须使用c
前缀文件名。
// 正确
#include <cstdio>
// 错误
#include <stdio.h>
所有的#include
必须放置于程序开头
预处理
所有的预编译指令(包括 #ifdef
等)不能缩进。
代码不能出现魔鬼数字,必须使用#define
用#define
声明的宏函数,减少空格的使用。
在#endif
后必须注释其对应的#if
。
#ifdef ABC
// some code
#endif // ABC
代码
缩进
对于每个代码块,使用与4个空格等长的 Tab 缩进。
花括号
花括号必须不换行,左花括号的左边必须有且仅有一个空格。
如:
if (condition) {
} else {
}
行
多个意义独立的代码块之间应该用空行隔开。
函数、成员函数、结构体、全局变量块之间必须用空行隔开。
if (condition) {
// some code
}
for (int i = 1; i <= n; ++i) {
// some code
}
using namespace std;
必须紧跟在 #include
后的空行后,之后必须一个空行。
不应该有两个连续的空行。
除 for
中的三个语句外,每行不能有超过一个由;
隔开的语句。
代码块
由流程控制语句引导的代码块可以省略花括号,但是不能嵌套。
// 正确
if (ok) printf("POSSIBLE
");
else printf("IMPOSSIBLE
");
// 错误
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j)
scanf("%d", a[i] + j);
不能使用逗号表达式。
函数
main
函数的返回值类型必须是 int
,不可以省略 return 0;
。
空函数体可以使用 {}
。
可以使用lamada
表达式。
main
函数必须放置于整个程序末尾。
函数声明修饰符(如inline
,template<typename T>
)后,必须有一个空格,包括行末。
inline template<typename T>
T abs(T x) {
return x >= 0 ? : -x;
}
变量
除用于字符串的char
数组外,所有长度大于(5)的数组必须使用全局变量。
空格
逗号 ,
与 for
中的分号 ;
后面必须有一个空格,前面不能有空格。
在()[]
前后不能有空格。
双目运算符、三目运算符的两侧必须有一个空格。
函数修饰冒号的右侧必须有一个空格,左侧不能有空格, 其他冒号两侧都必须有一个空格。
struct Edge {
int x;
Edge(): x(0) {}
}
x >= 0 ? x : -x;
流程控制关键字之后,函数名之后,左圆括号前必须有一个空格。
在.
、->
、::
的两边不能有空格。
在算术运算符,位运算付前后必须有一个空格。
在预处理记号后必须有一个空格。
在模板类的实例化时,出现嵌套的,>
之间必须有一个空格。
vector<vector<int> > v;
指针与引用
在描述类型名时,指针符号 *
和引用符号 &
与左侧的类型名之间必须有一个空格,与右侧的其它关键字之间不能有空格。
在定义变量、函数返回值、参数时,指针符号 *
和引用符号 &
与左侧的类型名之间必须有一个空格,与右侧的变量、函数、参数名之间不能有空格。
不能取数组某一项的地址,应该计算指针。
// 错误
scanf("%d", &a[i]);
// 正确
scanf("%d", a + i);
杂项
可以使用三目运算符,但不能嵌套。
可以使用switch-case
语句,但不能嵌套。
不能使用typedef
将自带类型重定义以缩短代码长度。
// 错误写法
typedef long long LL;
在不影响代码逻辑的前提下,使用将自增,自减的运算符放在前面。
++a;
不能使用 int
代替 bool
表示逻辑值。
不能使用 0
和 1
代替逻辑值 true
和 false
。