Chinaunix首页 | 论坛 | 博客
  • 博客访问: 335811
  • 博文数量: 47
  • 博客积分: 834
  • 博客等级: 军士长
  • 技术积分: 695
  • 用 户 组: 普通用户
  • 注册时间: 2011-12-07 09:38
文章分类
文章存档

2018年(1)

2015年(1)

2014年(2)

2013年(2)

2012年(23)

2011年(18)

分类: C/C++

2012-02-02 15:14:30

                                个人代码书写规范

————2012-3-20,版本0.0.0-LBS

一、代码版本命名规范

1-1、代码版本分为稳定版本和开发版本

版本号的命名参照linux内核命名规则,采用r.x.y点十进制方式命名

r目前发布的主版本号(与硬件相匹配,与每一版电路板相匹配)

x偶数代表稳定版本,奇数代表开发中版本

y开发过程中的错误修补升级版本

为了区分不同版本间的差异,需要在r.x.y后加上-LBS(作者名缩写)

1-2、版本号升级及变更说明:

r跟随硬件电路的升级而变更,例如升级到二系的门禁板,此版本号置为2,依次类推

x第一次开发置为1,出厂维护无法解决并返回研发室重新开发则置为3(奇数递增),依次类推,每次形成稳定版本出厂时,此版本号置为小于自己的最大偶数

y开发过程中由0999递增,出厂后此版本号不变,出厂维护的每次升级将此版本号递增1,出厂维护无法解决并返回研发室重新开发则置为0,重新计数

注解:r是匹配硬件电路的主版本号,x是内部开发的主版本号(奇数),在开发阶段y是调试修改升级的次版本号,在出厂维护阶段y是维护版本号

二、代码变量命名规范
       2-1通用的变量:循环loop,计数count,累加sum         (其他待积累)

    2-2、与功能相关:用于记录数据_reg  (register:记录)

                 标志位_flag

注解:如果需要用到这样功能的,描述放到变量名之后,例如***_flag

    2-3、与范围相关:全局变量    g

                 局部变量    local  ——  l

                 静态变量    static  ——  s

                 被外部引用  extern  ——  e

注解:静态变量只能出现在局部变量里,被外部引用只能出现在全局变量里,所以对于一个变量而言,此处与范围相关的描述只能有一种可能。

    2-4、数据类型:bool     —— b

                byte       —— by

                float       —— f

                double     —— d

                char       —— c  

                int         —— i (如果变量类型有unsigned的,在描述符后加上u,例iu)   

               结构体变量 —— s  (例如struct Long_Time ls_timer,局部结构体变量)

注解:此处结构体变量与静态变量都用s描述,只是描述等级不一样(描述等级为一个变量首先要反映出来的信息描述为最高!),而且不能用静态方式定义结构体变量的,结构体变量只有全局或局部之分

    2-5指针的描述放到所有描述之前(如果用到指针的话)

               指针      —— p

               二重指针  ——  pp(以此类推)

注解:例如int *pli_timer=&gi_sum;

变量命名公式:变量名=范围描述+数据类型+变量名英文释义

2-6、命名中若使用特殊约定或缩写,则要有注释说明

注解:应该在源文件的开始之处,对文件中所使用的缩写或约定,进行必要的注释说明

2-7、自己特有的命名风格,要自始至终保持一致,不可来回变化

三、代码函数实现规范      

3-1、在同一软件产品内,应规划好接口部分标识符(变量、结构、函数及常量)的命名,防止编译、链接时产生冲突

注解:例如在门禁开发中,可以以MJ_开头作为函数首部命名相关函数

3-2、用正确的反义词组命名具有互斥意义的变量或相反动作的函数等,提供以下积累(其他待积累)

add / remove        begin / end         create / destroy    put / get

insert / delete        first / last          get / release up / down

add / delete          lock / unlock       open / close cut / paste  

min / max           old / new          start / stop send / receive

next / previous      source / target      show / hide source / destination

increment / decrement

        

3-3、不要设计多用途面面俱到的函数,一个函数仅完成一件功能

3-4、尽量不要编写依赖于其他函数内部实现的函数

注解:例如为了实现某个功能而在模块的函数里面调用其他的函数,这样影响函数的独立性

3-5、避免单独使用无意义或含义不清的动词为函数命名(例如:processhandle

3-6、最好不要把与函数返回值类型不同的变量,以系统默认的转换方式或强制转换方式作为返回值返回

注解:如果要返回int 型变量最好让其函数返回类型也为int

3-7、设计高扇入、合理扇出的函数(扇出是指一个函数直接调用其它函数的数目,而扇入是指有多少上级函数调用它)

注解:当某个功能简单的函数仅有一个上级函数调用它时,应考虑把它合并到上级函数中,而不必单独存在

四、代码格式书写规范

4-1、程序块要采用缩进风格编写(缩进空格以source singht的一个“Tab”键为基准,四个字节)

4-2、定义所有局部变量后需要加个回车空行

4-3、一行只写一条语句,即不允许把多个短语句写在一行中

4-4iffordowhilecaseswitchdefault等语句自占一行,且无论执行语句的多少都要加括号{ },且程序块的分界符‘{’和‘}’应各独占一行并且位于同一列,同时与引用它们的语句左对齐。

注解:形如if(*********)

 {

      return 0;

  }

4-5ifforwhileswitch等与后面的括号间应加空格,使if等关键字更为突出明显

4-6if语句尽量加上else分支对没有else分支的语句要小心对待switch语句必须有default分支

4-7、逗号、分号只在后面加一个空格

注解:例如forloop=0; loop<100; loop++)或int  loop=0, num_reg=0

4-8、比较操作符赋值操作符"="、 "+=",算术操作符"+""%",逻辑操作符"&&""&",位域操作符"<<""^"等双目操作符的前后加空格

注解:例如 if (current_time  >=  MAX_TIME_VALUE) 

a = b + c;

a *= 2;

a = b ^ 2;

4-9"!""~""++""--""&"(地址运算符)等单目操作符前后不加空格(例如i++)

4-10"->""."前后不加空格

五、代码框架搭建规范  

5-1、尽量将高扇入的底层函数分类的归属到各自的源文件里,方便不同的应用工程移植

5-2、尽量将产品功能变化牵涉较多的函数归类到一个源文件,例如门禁开发中的逻辑关系的具体实现源文件

六、代码文本注释规范

6-1、一般情况下,源程序有效注释量必须在20%以上

注解:需要用SourceCounter工具查看代码的备注说明百分比

6-2、源文件头部应进行注释,列出:版权说明、版本号、生成日期、作者、模块功能、主要函数及其功能、修改日志等

注解:例如 /*

    * Entrance Guard System

    * 7-Jan-2012 Auther.Zhang 0.2 Version

  * Copyright & the right of find interpretation auther

     * synopsis:响应上位机的具体实现,服务于message.c

    *

     */

6-3、函数头部应进行注释,列出:函数的目的/功能、输入参数、输出参数、返回值、调用关系(函数、表)等

注解:例如 /*******************************************************************

   函数说明  :对函数的简单说明

   入口参数   :入口参数及功能

   返回类型  :

   初始时间  :2012-2-22 Lebaishi

   修改记录   :2012-3-23 支持下载过程中意外断网,下次下载不出错

   用途功能 :简述此函数的简单用途与目的

  ********************************************************************/

6-4、注释的内容要清楚、明了,含义准确,防止注释二义性

6-5、避免在注释中使用缩写,特别是非常用缩写

6-6、注释应与其描述的代码相近,对代码的注释应放在其上方或右方(对单条语句的注释)相邻位置,不可放在下面,如放于上方则需与其上面的代码用空行隔开

6-7、对于所有有物理含义的变量、常量,如果其命名不是充分自注释的,在声明时都必须加以注释,说明其物理含义。变量、常量、宏的注释应放在其上方相邻位置或右方

6-8、数据结构声明(包括数组、结构、类、枚举等),如果其命名不是充分自注释的,必须加以注释。对数据结构的注释应放在其上方相邻位置,不可放在下面;对结构中的每个域的注释放在此域的右方

6-9、全局变量要有较详细的注释,包括对其功能、取值范围、哪些函数或过程存取它以及存取时注意事项等的说明

注解:对于注释,单行的注释要与其上面的内容用空行隔开

6-10、避免在一行代码或表达式的中间插入注释

6-11、在程序块的结束行右方加注释标记,以表明某程序块的结束

注解:以方便当代码段较长,特别是多重嵌套时的代码可读性

七、代码优化方法积累

7-1、尽量用乘法或其它方法代替除法,特别是浮点运算中的除法

注解:浮点运算除法要占用较多CPU资源

八、代码质量检测标准

8-1、代码质量保证优先原则

      1)正确性,指程序要实现设计要求的功能。

      2)稳定性、安全性,指程序稳定、可靠、安全。

      3)可测试性,指程序要具有良好的可测试性。

      4)规范/可读性,指程序书写风格、命名规则等要符合规范。

      5)全局效率,指软件系统的整体效率。

      6)局部效率,指某个模块/子模块/函数的本身效率。

      7)个人表达方式/个人方便性,指个人编程习惯。

8-2、通过SourceCounter工具检测的代码注释量达到代码的20%,公共变量必须有较明细的功能记录

8-3、多线程的中的子线程退出必需采用主动退出方式,即通过return出口

8-4、过程/函数中分配的内存,在过程/函数退出之前要释放,不得引用已经释放的内存空间

8-5、过程/函数中申请的(为打开文件而使用的)文件句柄,在过程/函数退出之前要关闭

8-6、用PC-Lint工具检测,不得有内存超出操作越界等错误

阅读(3672) | 评论(0) | 转发(1) |
0

上一篇:Linux设备驱动例解

下一篇:sqlite3_get_table()

给主人留下些什么吧!~~