将函数体的开头大括号放在第一列很重要,并且尽量避免任何其他的括号出现在第一列。一些工具从第一列搜索大括号来寻找函数体的开头。如果不按这个格式,这些工具将无法工作。
在定义函数时,让函数名从第一列开始也很重要。这样做可以帮助代码阅读者寻找函数的定义,同时可以使主要的工具认出它们(函数定义)。标准的C格式如下:
static char *
concat (char *s1, char *s2)
{
……
}
如果你想使用C的传统风格,格式如下:
static char *
concat (s1, s2) /* 函数名在这里的第一列 */
char *s1, *s2;
{ /* 大括号在这里的第一列 */
……
}
在标准C中,如果函数的参数不能在一行中全部容下,可以将它拆解为这样:
int
lots_of_args (int an_integer, long a_long, short a_short,
double a_double, float a_float)
……
本节的剩余部分给出了其他方面C格式化风格的一些建议,这些风格也是1.2或更新版本indent程序的默认风格。相应选项如下:
-nbad -bap -nbc -bbo -bl -bli2 -bls -ncdb -nce -cp1 -cs -di2
-ndj -nfc1 -nfca -hnl -i2 -ip5 -lp -pcs -psl -nsc -nsob
不要把这些建议看作要求,因为两个不同程序持有不同风格的代码并不会产生什么问题。
但是无论你使用哪种风格,请坚持使用,因为在一个程序中使用混合的风格非常难看。如果你准备向一个已经存在的程序贡献修改,请遵照那个程序的原有风格。
对于函数体,我们的推荐风格如下:
if (x < foo (y, z))
haha = bar[4] + 5;
else
{
while (z)
{
haha += foo (z, z);
z--;
}
return ++x + bar ();
}
我们发现在原括号前和逗号之后增加一个空格会增强易读性,特别是在逗号之后。
当你将一个表达式拆分为多行时,请在符号前拆分,而不是之后,正确方法如下:
if (foo_this_is_long && bar > win (x, y, z)
&& remaining_condition)
尽量避免两个不同优先级的操作符出现在同一缩进的行中,例如,不要写成这样:
mode = (inmode[j] == VOIDmode
|| GET_MODE_SIZE (outmode[j]) > GET_MODE_SIZE (inmode[j])
? outmode[j] : inmode[j]);
因该使用额外的原括号来表明嵌套关系:
mode = ((inmode[j] == VOIDmode
|| (GET_MODE_SIZE (outmode[j]) > GET_MODE_SIZE (inmode[j])))
? outmode[j] : inmode[j]);
插入额外的圆括号,Emacs将可以正确地缩排代码。例如,下面的缩进如果手工来做将看起来很好:
v = rup->ru_utime.tv_sec*1000 + rup->ru_utime.tv_usec/1000
+rup->ru_stime.tv_sec*1000 + rup->ru_stime.tv_usec/1000;
但Emacs将调整它,增加一对圆括号使得代码同样好看,Emacs将会保存:
v = (rup->ru_utime.tv_sec*1000 + rup->ru_utime.tv_usec/1000
+rup->ru_stime.tv_sec*1000 + rup->ru_stime.tv_usec/1000);
将do-while格式为这样:
do
{
a = foo (a);
}
while (a > 0);
请使用“进纸”字符(control-L)按照逻辑位置(但是不能在函数内部)将代码分为不同页。页有多长是无关痛痒的,因为并不需要去适合打印纸的大小。进纸符应该独自占据一行。









评论人