关于 C 代码的缩进

LiYanrui posted @ May 04, 2008 05:49:13 AM in 程序设计 with tags c , 9807 阅读

关于 C 代码的缩进,网上有许多讨论,譬如 Tab 键的尺寸是 4 还是 8,if/else/for/while 等关键字之后的花括号的放置,函数返回类型与函数名要不要等行放置……这些问题通常都是公理婆理的问题,最好不要那么较真,只需要认真选择一种适合团队或自己的风格即可,当然严格遵守某种制定的较为系统的编码风格最好。

在未介入 Linux 开发环境之前,一直是在 Visual C++ IDE 中过活,对其默认的 C 编码风格比较习惯了,所以当后来遇见一些 GNU 代码、Linux 内核代码,心里感觉有点怪异,不过认真阅读了那些颇有道理的解释 (GNU Coding Standards || $LINUX_SRC/Documentation/CodingStyle),也就开始崇拜起来,因为在 Windows 环境中搞开发时,很少见到如此鲜明的论述。

在看了许多许多的唇枪舌剑般的辩论之后,我找到了自己喜欢的 C 代码风格,那就是:

$ indent -kr -i8 -pcs -psl   foo.c

关于 indent 命令的用法,没有什么好的文档推荐,man 一下即可。这里简要介绍一下,"-kr" 选项表示使用 K&R C 风格,"-i8" 选项表示代码缩进是 8 个空格,"-pcs" 选项表示函数名与其后的 "(" 之间存在空格,"-psl" 选项可让函数返回类型与函数名分行显示。

在使用 indent 工具美化 C 代码时,值得注意地一个问题就是如何识别使用 "typedef" 自定义的关键字。如下例: 

/*! \brief 包围盒 */
typedef struct {
        M2Point v1;          /*< 坐标值最小顶点 */
        M2Point v2;          /*< 坐标值最大顶点 */
        M2Object *data; /*< Box 所包含的数据(几何)对象 */
} M2Box;

现在使用 M2Box 类型声明一个指针,另外使用 int 类型声明一个指针作为参照,indent 给出的代码风格如下:

int *p;
M2Box * box;

仔细看一下上述两个指针类型的声明,可以发现使用自定义类型声明的指针名与指针符号 "*" 之间存在一个空格,这是因为 indent 没有将 M2Box 作为关键字来处理,而是愚蠢地认为 "M2Box * box" 是一个 "M2Box" 变量乘以 "box" 变量。要解决这一问题,需要使用 "-T" 选项告诉 indent,“M2Box 是关键字” :

$ indent -kr -i8 -pcs -psl -TM2Box    foo.c

使用 indent 时,如果每次都是重复输入选项参数,就有点冒傻气,最好是将这些命令选项放到 $HOME/.indent.pro 文件中。

Yue Wang 说:
2008年5月04日 07:22 我写C程序的时候总觉得indent类的命令会把我的代码排得七零八落。因为我用的基本上是BSD的风格,而有些处理上并不严格按照BSD的风格,而且写代码的时候总会遇到一些非一般的情况,所以后来索性随心所欲了,呵呵。这时候我觉得设置好编辑器比如vim或者emacs比较重要。 现在很少写代码了,偶尔做项目写一些Lua程序,基本上是Lua代码中嵌入TeX文档(我在水木上发过类似的后处理程序,类似于WEB但是和WEB很不同),代码乱就不管了,文档看得舒服就行,做小项目还算得心应手。
Yue Wang 说:
2008年5月04日 07:28 哦,忘了贴地址了。 http://bbs.ctex.org/viewthread.php?tid=39424 用这个写过一个几千行的小程序,呵呵。见笑了:)
Avatar_small
LiYanrui 说:
2008年5月04日 08:49 很好的示例。 我现在比较发愁我们项目的文档问题,虽然已经开用 doxgen,但总觉得它搞得太复杂,另外代码注释中的数学公式也很是个问题。我打算用 python 也写一个类似的,用于处理 c 文档,配合 ConTeXt 来用。

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter