当前位置: 首页 >> 程序设计 >> GNU C 编码规范:格式化你的源代码
 

GNU C 编码规范:格式化你的源代码

作者:ylc3895_cn      来源:     发表时间:2006-07-03     浏览次数:      字号:    

将函数体的开头大括号放在第一列很重要,并且尽量避免任何其他的括号出现在第一列。一些工具从第一列搜索大括号来寻找函数体的开头。如果不按这个格式,这些工具将无法工作。
      在定义函数时,让函数名从第一列开始也很重要。这样做可以帮助代码阅读者寻找函数的定义,同时可以使主要的工具认出它们(函数定义)。标准的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)按照逻辑位置(但是不能在函数内部)将代码分为不同页。页有多长是无关痛痒的,因为并不需要去适合打印纸的大小。进纸符应该独自占据一行。

责任编辑 webmaster

 
 
 
 
 
评论更多>>
 
不错的 好
 
 
发表
 
姓名: QQ:
性别: MSN:
E-mail: 主页:
评分: 1 2 3 4 5
评论内容:
验证码:
  
  • 请遵守《互联网电子公告服务管理规定》及中华人民共和国其他各项有关法律法规。
  • 严禁发表危害国家安全、损害国家利益、破坏民族团结、破坏国家宗教政策、破坏社会稳定、侮辱、诽谤、教唆、淫秽等内容的评论 。
  • 用户需对自己在使用本站服务过程中的行为承担法律责任(直接或间接导致的)。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表网友个人观点,与本网站立场无关。
  •