Skip to content
On this page

C语言编码风格


标签:clang/basic  

由于 C 语言是依照花括号和分号进行语义划分的, 所以对代码格式的要求不像 Python 那样高, 我们甚至能将大量代码写在一行里成功通过编译. 但这对维护造成很大麻烦, 所以遵循一定的编码风格是程序员的基本素养.

空格与换行

  1. 关键字与括号之间需要有空格 :
c
while (1);
if {}
  1. 双目运算符两边需要加空格:
c
c = a == b;
i > 0;
  1. 后缀运算符和操作数之间不加空格:
c
a.b;
a[1];
a(b);
  1. 优先级高的数之间可以不加空格, 方便阅读:
c
a = fun(x*x + y*y); 
// 这点和第二点略冲突, 但要注意, 风格规则是为了便于阅读而存在的
  1. Unix 系统默认终端是 24 * 80 的, 所以当句子长度大于 80 字符的时候, 建议换行显示并缩进对齐:
c
int a = functionABCDEFG(.......,
					   .........,
					   .........);
  1. 较长的字符串需要截断后分行书写:
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);
  1. 关于缩进 : 不能使用空格 , 使用 Tab , 可以在编辑器中设置自己喜欢的空格长度
  2. 关于换行 : 函数定义的 {} 独占一行 , 分支, 循环, 结构体 等的 { 可以跟在第一行
  3. switchcase 不缩进 :
c
switch (c) {
case 1:
	break;
case 2:
default:
	...
}
  1. 逻辑段落之间分开
c
#include <stdio.h>
						/* <----- 分开, 上面是头文件引入 */
int main()
{
	int a = 10;
						/* <----- 分开, 上面是变量声明   */
	printf("%d\n", a);
						/* <----- 分开, 上面是函数主体   */
	return 0;
}
  1. 单行注释也应该采用 /* */ , 多行注释在每行行头添加对齐的* :
c
/* 这是一个单行注释 */

/**
 * 这是一个
 * 多行
 * 注释
 */

==

使用 if(0 == a)而不是if(a == 0),因为常数不能作为左值,避免if(a = 0)这种情况的出现。

函数

  1. 函数的注释写在函数上面, 而不是函数里面, 采用文档注释, 部分编辑器能够进行智能提示
  2. 标志符命名可以遵循一定的习惯对单词缩写:
    • temporary -> temp/tmp
    • count -> cnt
    • number -> num/nr
    • internationalization -> i18n
    • ......
  3. 一般来说, 变量命名应该用下划线命名法, 用小写单词加下划线的方法, 常量用大写单词加下划线的方法, 但依据团队和项目不同, 可能习惯不同, 但同一编程环境下需要一个统一的规则.
  4. 函数的层次不宜过多, 最好在 4 层以内
  5. 函数的长度不宜过长, 不要超过 48 行, 即 24 * 80 终端的两屏, 但一些简单的 switch / case 是允许的
  6. 函数调用是一个动作, 所以函数名称需要包括动词, 比如, get_HTML() , render_page()
  7. 局部变量不宜过多, 超过 5 到 10 个需要考虑抽象函数了

Last updated: