Appearance
由于 C 语言是依照花括号和分号进行语义划分的, 所以对代码格式的要求不像 Python 那样高, 我们甚至能将大量代码写在一行里成功通过编译. 但这对维护造成很大麻烦, 所以遵循一定的编码风格是程序员的基本素养.
空格与换行
- 关键字与括号之间需要有空格 :
c
while (1);
if {}- 双目运算符两边需要加空格:
c
c = a == b;
i > 0;- 后缀运算符和操作数之间不加空格:
c
a.b;
a[1];
a(b);- 优先级高的数之间可以不加空格, 方便阅读:
c
a = fun(x*x + y*y);
// 这点和第二点略冲突, 但要注意, 风格规则是为了便于阅读而存在的- Unix 系统默认终端是 24 * 80 的, 所以当句子长度大于 80 字符的时候, 建议换行显示并缩进对齐:
c
int a = functionABCDEFG(.......,
.........,
.........);- 较长的字符串需要截断后分行书写:
c
printf("This is a very long sentence that can't display in one line"
"so I break it into two lines\n");C 语言编译器会自动将这两个字符串拼接起来 , 但这也会给其他地方留下坑:
c
char days[8][20] = {"Monday", "Tuesday"
"Wednesday", "Thursday"
"Friday", "Saturday", "Sunday"}上面的代码漏写了两个 " , " 但编译器不会报错 , 因为它认为你写的是跨行的字符串. 7. 逗号和分号后要加空格 , 这符合英文的书写习惯:
c
foo(bar, baz);- 关于缩进 : 不能使用空格 , 使用 Tab , 可以在编辑器中设置自己喜欢的空格长度
- 关于换行 : 函数定义的
{}独占一行 , 分支, 循环, 结构体 等的{可以跟在第一行 switch的case不缩进 :
c
switch (c) {
case 1:
break;
case 2:
default:
...
}- 逻辑段落之间分开
c
#include <stdio.h>
/* <----- 分开, 上面是头文件引入 */
int main()
{
int a = 10;
/* <----- 分开, 上面是变量声明 */
printf("%d\n", a);
/* <----- 分开, 上面是函数主体 */
return 0;
}- 单行注释也应该采用
/* */, 多行注释在每行行头添加对齐的*:
c
/* 这是一个单行注释 */
/**
* 这是一个
* 多行
* 注释
*/==
使用 if(0 == a)而不是if(a == 0),因为常数不能作为左值,避免if(a = 0)这种情况的出现。
函数
- 函数的注释写在函数上面, 而不是函数里面, 采用文档注释, 部分编辑器能够进行智能提示
- 标志符命名可以遵循一定的习惯对单词缩写:
temporary->temp/tmpcount->cntnumber->num/nrinternationalization->i18n- ......
- 一般来说, 变量命名应该用下划线命名法, 用小写单词加下划线的方法, 常量用大写单词加下划线的方法, 但依据团队和项目不同, 可能习惯不同, 但同一编程环境下需要一个统一的规则.
- 函数的层次不宜过多, 最好在 4 层以内
- 函数的长度不宜过长, 不要超过 48 行, 即 24 * 80 终端的两屏, 但一些简单的 switch / case 是允许的
- 函数调用是一个动作, 所以函数名称需要包括动词, 比如,
get_HTML(),render_page() - 局部变量不宜过多, 超过 5 到 10 个需要考虑抽象函数了