现在的位置: 首页 > 综合 > 正文

编程规范和范例

2012年10月18日 ⁄ 综合 ⁄ 共 3599字 ⁄ 字号 评论关闭
  1. 【一】注释:
  2. 1.说明性文件(如头文件.h文件、.inc文件、.def文件、编译说明文件.cfg等)头部应进行注释,注释必须列出:版权说明、版本号、生成日期、作者、内容、功能、与其它文件的关系、修改日志等,头文件的注释中还应有函数功能简要说明。
  3. 示例:下面这段头文件的头注释比较标准,当然,并不局限于此格式,但上述信息建议要包含在内。
  4. /************************************************************
  5.   Copyright (C), 1988-1999, Huawei Tech. Co., Ltd.
  6.   FileName: test.cpp
  7.   Author:        Version :          Date:
  8.   Description:     // 模块描述      
  9.   Version:         // 版本信息
  10.   Function List:   // 主要函数及其功能
  11.     1. -------
  12.   History:         // 历史修改记录
  13.       <author>  <time>   <version >   <desc>
  14.       David    96/10/12     1.0     build this moudle  
  15. ***********************************************************/
  16. 说明:Description一项描述本文件的内容、功能、内部各部分之间的关系及本文件与其它文件关系等。History是修改历史记录列表,每条修改记录应包括修改日期、修改者及修改内容简述。
  17. 2.函数头部应进行注释,列出:函数的目的/功能、输入参数、输出参数、返回值、调用关系(函数、表)等。
  18. 示例:下面这段函数的注释比较标准,当然,并不局限于此格式,但上述信息建议要包含在内。
  19. /*************************************************
  20.   Function:       // 函数名称
  21.   Description:    // 函数功能、性能等的描述
  22.   Calls:          // 被本函数调用的函数清单
  23.   Called By:      // 调用本函数的函数清单
  24.   Table Accessed: // 被访问的表(此项仅对于牵扯到数据库操作的程序)
  25.   Table Updated:  // 被修改的表(此项仅对于牵扯到数据库操作的程序)
  26.   Input:          // 输入参数说明,包括每个参数的作
  27.                   // 用、取值说明及参数间关系。
  28.   Output:         // 对输出参数的说明。
  29.   Return:         // 函数返回值的说明
  30.   Others:         // 其它说明
  31. *************************************************/
  32. 3.数据结构声明(包括数组、结构、类、枚举等),如果其命名不是充分自注释的,必须加以注释。对数据结构的注释应放在其上方相邻位置,不可放在下面;对结构中的每个域的注释放在此域的右方。
  33. 示例:可按如下形式说明枚举/数据/联合结构。
  34. /* sccp interface with sccp user primitive message name */
  35. enum  SCCP_USER_PRIMITIVE
  36. {
  37.     N_UNITDATA_IND, /* sccp notify sccp user unit data come */
  38.     N_NOTICE_IND,   /* sccp notify user the No.7 network can not */
  39.                     /* transmission this message */
  40.     N_UNITDATA_REQ, /* sccp user's unit data transmission request*/
  41. };
  42. 4.全局变量要有较详细的注释,包括对其功能、取值范围、哪些函数或过程存取它以及存取时注意事项等的说明。
  43. 示例:
  44. /* The ErrorCode when SCCP translate */
  45. /* Global Title failure, as follows */      // 变量作用、含义
  46. /* 0 - SUCCESS   1 - GT Table error */
  47. /* 2 - GT error  Others - no use  */       // 变量取值范围
  48. /* only  function  SCCPTranslate() in */
  49. /* this modual can modify it,  and  other */
  50. /* module can visit it through call */
  51. /* the  function GetGTTransErrorCode() */    // 使用方法
  52. BYTE g_GTTranErrorCode;  
  53. 【二】标识符命名:
  54. 1.标识符的命名要清晰、明了,有明确含义,同时使用完整的单词或大家基本可以理解的缩写,避免使人产生误解。
  55. 说明:较短的单词可通过去掉“元音”形成缩写;较长的单词可取单词的头几个字母形成缩写;一些单词有大家公认的缩写。
  56. 示例:如下单词的缩写能够被大家基本认可。
  57. temp 可缩写为  tmp  ;
  58. flag 可缩写为  flg  ;
  59. statistic 可缩写为  stat ;
  60. increment 可缩写为  inc  ;
  61. message 可缩写为  msg  ;
  62. 2.对于变量命名,禁止取单个字符(如i、j、k...),建议除了要有具体含义外,还能表明其变量类型、数据类型等,但i、j、k作局部循环变量是允许的。
  63. 说明:变量,尤其是局部变量,如果用单个字符表示,很容易敲错(如i写成j),而编译时又检查不出来,有可能为了这个小小的错误而花费大量的查错时间。
  64. 示例:下面所示的局部变量名的定义方法可以借鉴。
  65. int liv_Width
  66. 其变量名解释如下:
  67.         l      局部变量(Local)  (其它:g    全局变量(Global)...)
  68.         i      数据类型(Interger)
  69.         v      变量(Variable)   (其它:c    常量(Const)...)
  70.         Width  变量含义
  71. 这样可以防止局部变量与全局变量重名。
  72. 3.用正确的反义词组命名具有互斥意义的变量或相反动作的函数等。
  73. 说明:下面是一些在软件中常用的反义词组。
  74. add / remove       begin / end        create / destroy 
  75. insert / delete    first / last       get / release
  76. increment / decrement                 put / get
  77. add / delete       lock / unlock      open / close
  78. min / max          old / new          start / stop
  79. next / previous    source / target    show / hide
  80. send / receive     source / destination
  81. cut / paste        up / down
  82. 示例:
  83. int  min_sum;
  84. int  max_sum;
  85. int  add_user( BYTE *user_name );
  86. int  delete_user( BYTE *user_name );
  87. 4.避免使用不易理解的数字,用有意义的标识来替代。涉及物理状态或者含有物理意义的常量,不应直接使用数字,必须用有意义的枚举或宏来代替。
  88. 示例:如下的程序可读性差。
  89. if (Trunk[index].trunk_state == 0)
  90. {
  91.     Trunk[index].trunk_state = 1;
  92.     ...  // program code
  93. }
  94. 应改为如下形式。
  95. #define TRUNK_IDLE 0
  96. #define TRUNK_BUSY 1
  97. if (Trunk[index].trunk_state == TRUNK_IDLE)
  98. {
  99.     Trunk[index].trunk_state = TRUNK_BUSY;
  100.     ...  // program code
  101. }

抱歉!评论已关闭.