括号位置的问题在C编程风格中经常被提出。和缩进大小不同,括号位置的选择 并没有太多技术上的原因,而更多的是个人的喜好。比如Kernighan和Ritchie的 弟子们把左括号放在一行的最后,把右括号放在一行的开始,象这样:
if (x is true) {
we do y
}
但是,函数是一种特殊的情况,函数的左括号放在下一行的开始,象这样:
int function(int x)
{
body of function
}
全世界的异端人士指出这种不一致的做法 ...嗯... 不太一致,但是所有思维正 确的人知道 (a) K&R是_对_的 (b) K&R是对的。而且,函数确实是特殊的(你在C 中无法对函数进行嵌套)。
注意到右括号完全占有单独的一行,_除非_当它后面还有未完成的语句,比如do 语句中的“while”或者if语句中的“else”,想这样:
do {
body of do-loop
} while (condition);
和
if (x == y) {
..
} else if (x > y) {
...
} else {
....
}
原因:K&R。
还有,注意到这种括号的布局方法还减少了空行(或者说是几乎是空行)的数目, 而且没有减小可读性。因为你屏幕上的空行是不可回收资源(这里想一下25行的 终端屏幕),这样你会有更多的空行用于加注释。
第三章:命名
没什么,我们都遇到过。你可能从老Unix用户那里听说过“GNU emacs”会自动 对齐C源代码,但缺省的设置不是很好(事实上,缺省设置比胡乱敲打还糟糕 - 一群使用GNU emacs猴子永远不会做出漂亮的程序)。
所以,你或者彻底仍掉GNUemacs,或者采用更理智的设置。如果选择后者,你可一把下面的代码加到你的.emacs文件中:
(defun linux-c-mode ()
"C mode with adjusted defaults for use with the Linux kernel."
(interactive)
(c-mode)
(c-set-style "K&R")
(setq c-basic-offset 8))
这会定义 M-x linux-c-mode 命令。当编写Linux模块时,如果你把字符串“-*- linux-c -*-”放在文件的头两行中,这个模式就会被自动激活。还有,如果你 想在编辑/usr/src/linux目录下的源文件时linux-c-mode被自动激活,你在你的. emacs文件中需要加入
(setq auto-mode-alist (cons '("/usr/src/linux.*/.*\\.[ch]$" . linux-c-mode) auto-mode-alist))
但是即使你用不了emacs,并不是世界末日:你还可以使用“indent”。
又一次,GNU indent使用了和GNU emacs一样的脑死亡设置,所以你需要给它一 些命令行选项。但是,这不算太坏,因为即使是GNU indent的作者们也意识到了 K&R的权威性(GNU的人也不是魔鬼,他们只是在这件事上被误导了),所以你可 以使用选项“-kr -i8”(表示“K&R,8字符缩进”)运行indent。
“indent”有很多选项,特别是注释布局部分,你可能想看看它的man手册。但 是请记住:“indent”不能修改糟糕的程序。
第七章:配置文件
配置选项 (arch/xxx/config.in,以及所有Config.in文件)使用了有些不同的缩进方式。
代码中使用的是3字符缩进,config-选项中应该使用2字符缩进标识依赖关系。 后者只应用于bool/tristat选项。对于其他选项,采用你认为最合适的缩进方式就可以了。例如:
if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
tristate 'Apply nitroglycerine inside the keyboard (DANGEROUS)' CONFIG_BOOM
if [ "$CONFIG_BOOM" != "n" ]; then
bool ' Output nice messages when you explode' CONFIG_CHEER
fi
fi
一般来说,所有不稳定的选项应该标为CONFIG_EXPERIMENTAL。所有可能损坏数据的的选项应该标为(DANGEROUS),其他的试验选项应该标为(EXPERIMENTAL)。
第八章:数据结构