Skip to content

Latest commit

 

History

History
210 lines (168 loc) · 5.08 KB

File metadata and controls

210 lines (168 loc) · 5.08 KB

PC GO 编码风格

通用

字符编码

  • 不要使用不兼容 ASCII 的字符编码方案。

  • 建议使用 UTF-8 作为源码文件的字符编码,以保证文件的通用性。

  • 不要为 UTF-8 编码的源码文件添加字节序标记(BOM)。

C

缩进

  • 缩进应为一个制表符,不能用空格代替。并且我们建议将文本编辑器的制表符显示设定为 8 个字符的宽度。

  • switch 块外的标号不缩进。

  • if、switch、for、while 语句中的条件表达式需要换行时,新的一行应与前一行保持相同的缩进,参阅“条件表达式”一节。

空格

  • 在双目运算符的两侧应各有一个空格,例如:
a = b * 22;
  • 在一行中间的逗号和分号的后面有空格,例如:
int a = 1, b = 0; a += b;
  • 上述规则可以为突显优先级而调整,例如,省略高优先级预算符两侧的空格:
foo(a*3 + b/a);

在for语句中为突显优先级而省略空格:

for(i=1; i<=t; i++) r += putmss(s, i);

省略下标运行符中的空格:

dest[size_orig+len_src] = 0;
  • 单目运算符、后缀运算符和操作数之间没有空格,例如:
display(table[i++]);
table[i] = program.info->count;
  • 不在行首的花括号的左侧应有一个空格;如果花括号的右侧不立即换行,且不是逗号或分号,应接着有一个空格。

  • 左括号的右侧和右括号的左侧没有空格。

  • 声明指针时,星号与类型之间有空格,与指针名之间没有空格,例如:

char *msg;
  • 声明返回指针类型的函数时,星号与类型之间有空格,星号右侧没有空格,无论后面是否直接是函数名,例如:
void *malloc(size_t);
void *__cdecl malloc(size_t);

换行

  • 在用作语句块开始的左花括号后换行。

  • 如果语句块由一些语句控制,相应的花括号与控制语句在同一行,并用空格分隔,例如:

if(is_ready()) {
	foo(a + b);
	a += 2;
} else {
	set_some(b);
}
  • 如果 if、for、while 语句所控制执行的语句只有一个,且条件表达式与语句都很短小,它们可以写成一行,除空语句外,它们之间应有一个空格,例如:
if(a == b) foo();

while(1);

如果存在且只存在一个 else 分支,则视这些语句的总长度自行判断是否在 else 之前换行,例如:

if(some) foo(a); else foo(b);

if(a == b) foo(a);
else foo(a - b);

否则应在每个 else 之前换行,例如:

if(a < b) foo(1);
else if(a > b) foo(2);
else foo(a % 2);

其它情况应使用语句块,例如:

if(a == b) {
	foo(a * 2);
} else {
	foo(b);
}

if(a == b) {
	foo(a);
	foo(b);
	a = 0;
}
  • 即使 do-while 语句所控制的语句只有一个,也不应将它们写在一行,应使用语句块,例如:
do {
	do_some(a + b);
} while(a++);

函数声明

  • 如果此函数不接受参数,函数定义时可不声明参数列表;但在单独的非定义声明时,必须声明参数列表为 void,例如:
long int do_some(void);
  • 不要求每个函数都有非定义声明。

  • 如果此函数返回 int 类型,声明时不能省略类型。

  • main 函数必须返回 int 类型。

  • 避免隐式声明。

函数名

  • 建议使用全小写,下划线分隔单词的命名方式。

  • 不要使用匈牙利命名法。

变量声明

  • 对于局部变量,尽量在用到时再声明;如果编译器支持,可混合书写声明和代码。

变量名

  • 建议使用全小写,下划线分隔单词的命名方式。

  • 外部变量应尽可能使用全称,而不是缩写,使其清晰明了。

  • 用作局部的循环计数变量应命名为单个字母,例如:i, j。

  • 尽量不使用匈牙利命名法。

  • 除本身翻译就是如此外,不能使用汉语拼音代替英语名称。

类型定义

  • 类型定义的形式类似于声明变量。

  • 除非有特别的意义,不应为指向某种类型的指针定义新的类型名,以避免混乱,以下是坏的例子:

typedef int *PINT,*LPINT;
  • 参阅:“空格”一节。

条件表达式

  • 条件表达式在换行时,应在逻辑与、逻辑或运算符之后换行,例如:
if(status == foo(a, b + 1) &&
status != foo(status_old, b)) {
	do_some();
}

有关if的缩进请参阅“缩进”一节。

  • 当一个条件表达式中同时使用逻辑与、逻辑或运算符时,务必在相应位置加上括号以明确优先级,例如:
if((a && b) || c) do_some();

if(a && (b || c)) do_some();

if(a || (b && c)) do_some();
  • 不要使用逻辑取反运算来判断某个返回 0 为成功的函数成功返回,例如不要这样:
if(!strcmp(argv[1], "--version")) {
	puts(VERSION);
	return 0;
}

应该这样:

if(strcmp(argv[1], "--version") == 0) {
	puts(VERSION);
	return 0;
}

版权所有 2007-2014 PC GO Ld. 以及 版权所有 2015-2018 Rivoreo 以《Creative Commons Attribution-ShareAlike 4.0 International License》发布