LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: realtang

Linux 内核代码风格(编译自内核documentation/CodingStyle)

[复制链接]
发表于 2007-4-7 22:19:06 | 显示全部楼层
Post by herberteuler
用 Emacs 多了以后倒觉得 GNU 风格的代码读起来最舒服了。以前我也是 K&R 和 BSD 风格的强烈支持者,但现在我喜爱 GNU 风格更甚于前两者。

另外,适合于内核的风格并不一定适合于其他的程序。我没写过内核相关的程序,可能它们并不需要太深的嵌套。但一些应用型的程序嵌套多点儿也不是坏事。如果说写程序追求的是可读性和可维护性,嵌套应该不是问题--事实上,系统里不同部分的角色的划分比嵌套的多少更重要。


但你不觉得2个空格很容易把分块搞错吗,特别是跨越多行时。
而且我对他们的"{"号的对齐位置很不惯。
比如
  1. for (...)
  2.   {
  3.      /* */
  4.   }
复制代码
回复 支持 反对

使用道具 举报

发表于 2007-4-8 00:23:46 | 显示全部楼层
Post by Fixend
但你不觉得2个空格很容易把分块搞错吗,特别是跨越多行时。
而且我对他们的"{"号的对齐位置很不惯。
比如
  1. for (...)
  2.   {
  3.      /* */
  4.   }
复制代码

呵呵,你可以试着仔细读一些 GNU 的源代码,比如 Emacs、GCC 等的源代码。我发现它们非常清晰易懂。2 个空格的缩近可能是少了点,但在嵌套有许多层的情况下(这在一些具有复杂逻辑的应用中是非常常见的),这更容易保证程序的右边界不超过 80 个字符。

喜爱 GNU 的风格也许只是爱屋及乌。但我现在确实更希望将花括号像下面这样缩近 (来源: Emacs):
  1. DEFUN ("cond", Fcond, Scond, 0, UNEVALLED, 0,
  2.        doc: /* Try each clause until one succeeds.
  3. Each clause looks like (CONDITION BODY...).  CONDITION is evaluated
  4. and, if the value is non-nil, this clause succeeds:
  5. then the expressions in BODY are evaluated and the last one's
  6. value is the value of the cond-form.
  7. If no clause succeeds, cond returns nil.
  8. If a clause has one element, as in (CONDITION),
  9. CONDITION's value if non-nil is returned from the cond-form.
  10. usage: (cond CLAUSES...)  */)
  11.      (args)
  12.      Lisp_Object args;
  13. {
  14.   register Lisp_Object clause, val;
  15.   struct gcpro gcpro1;

  16.   val = Qnil;
  17.   GCPRO1 (args);
  18.   while (!NILP (args))
  19.     {
  20.       clause = Fcar (args);
  21.       val = Feval (Fcar (clause));
  22.       if (!NILP (val))
  23.         {
  24.           if (!EQ (XCDR (clause), Qnil))
  25.             val = Fprogn (XCDR (clause));
  26.           break;
  27.         }
  28.       args = XCDR (args);
  29.     }
  30.   UNGCPRO;

  31.   return val;
  32. }
复制代码

看得多的就习惯了,喜不喜欢是另一回事儿;但无论如何,把程序写得清晰易懂、使别人接手时困难尽可能的少,应该是各种不同风格相同的目标。
回复 支持 反对

使用道具 举报

发表于 2007-4-8 00:45:45 | 显示全部楼层
我觉得tab定义为4个空格长度很合理。

定义为2个,代码块的结构不够清晰。定义为8个,实在太浪费空间。诚如楼上某位兄弟所言,当一些变量名较长且缩进层次较多时,那么就不停的换行了。

不能那么死性的依从这些所谓的“规范”。特别是LINUX内核编程风格的作者认为“把tab定义为4就类似于把PI定义为3一样”,那么把tab定义为8,岂不等同于把PI定义为6?
回复 支持 反对

使用道具 举报

发表于 2007-4-8 10:51:47 | 显示全部楼层
Post by biinn

注意我在改代码时把第10行最后的{删掉了,编译的错误信息是:

  1. ledopd.c:86: warning: type defaults to `int' in declaration of `system_event_stop'
  2. ledopd.c:86: error: conflicting types for 'system_event_stop'
  3. /vobs/ggm-rel/sgw/source/build/target/include/system_event.h:186: error: previous declaration of 'system_event_stop' was here
  4. ledopd.c:86: error: conflicting types for 'system_event_stop'
  5. /vobs/ggm-rel/sgw/source/build/target/include/system_event.h:186: error: previous declaration of 'system_event_stop' was here
  6. ledopd.c:86: warning: data definition has no type or storage class
  7. ledopd.c:88: error: parse error before "return"
复制代码

我花了两个多小时在google上也没找到真正的原因。最后下班回家,第二天早上再看代码,一眼看到第10行少了个括号。。。
所以我还是把括号放到一行吧,呵呵。


呵呵, 看到 parse error , 明显是语法分析出错,加之自己对代码作修改了, 找出不匹配的 {, ( 之类已经成了定势

btw: 现在还是满喜欢这种风格的:

  1. if(...){
  2.   ...
  3. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2007-4-8 23:32:37 | 显示全部楼层
Post by rickxbx
呵呵, 看到 parse error , 明显是语法分析出错,加之自己对代码作修改了, 找出不匹配的 {, ( 之类已经成了定势
[/code]

惭愧,这种错误信息我是第一次看到,一着急,没仔细看最后一行,呵呵。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表