-
不要使用不兼容 ASCII 的字符编码方案。
-
建议使用 UTF-8 作为源码文件的字符编码,以保证文件的通用性。
-
不要为 UTF-8 编码的源码文件添加字节序标记(BOM)。
-
缩进应为一个制表符,不能用空格代替。并且我们建议将文本编辑器的制表符显示设定为 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》发布