首页 > 代码库 > 编程规范基础学习笔记

编程规范基础学习笔记

 

基本原则:
1.直观
2.简捷
3.不要省

*****************************************************************************************

     ---命名规则---
常量名:大写,HAVE_ARCH_STRNCAT
变量名:
    1.英文单词组合,可望文生义,避免无意义的数字编号取名。size,len,val,flag
    2.简捷,不要过长。
    3.名词性词组:DataGotFromSD, CurrentVal   ?    current_val  ?   currentVal?
    4.局部变量:n,m
      i,j,k一般用于int型变量(循环)
               c,ch一般用于字符型变量
               str表示字符串
     a表示数组
     p表示指针
    5.定义变量时(尤其是指针),必须要先初始化。
    6.不要使用八进制常数。
    7.不要省结构体名:   typedef struct innode
           {
     int num;
      }INNODE;
函数名
     1.动词性词组:GetDataFromSD()
     2.注意区分字母和数字l,1,o,0
     3.函数名不要用在其他地方。

*****************************************************************************************

    ---流程控制语句编写规范---
if:
1.与零值比较:
      1.bool变量: if(bTestFlag);    if(!bTestFlag);
 2.int变量 :if( a ==0)  ;if(a!=0)
 3.float变量 :const float EXP = 0.000001(float类型能保留6位小数)
   if ( a < EXP && a >-EXP)
 3.指针变量:if(NULL==p);   if(NULL!=p)

2.条件表达式中,有产生布尔类型数据的表达式中不能有赋值。
错误:if((x=y)!=0)    if(x=y)

3.括号应该对齐写,代码应该缩进4个字符(不用TAB)
if(condition)
{
    //code
}
else
{
    //code
}

3.先处理正常情况,再处理异常情况。

4.if -elseif- 最后应该加else结束。

switch case
1.少分支用if-else,多分支用switch-case
2.switch中表达式中不要有浮点数,不应是产生布尔类型值。
3.case后加整型或字符型常量。每个case实现一个功能,后面必须加break,不要加return;
4.case可按数字或字母顺序排列,正常情况或执行频率高的放前面。
5.case语句要精练<20行,可写成子函数。
6.最后必须加default分支默认处理,default不要用来正常处理。


for循环
1.直观:控制变量采用半闭半开更直观,不要在循环体内修改循环变量。
 for(i=0;i<10;i++)

2.精简:循环内不要过长<20行,循环嵌套不要超过3层。

3.长循环放内层。
for(i=0;i<3;i++)
{
    for(j=0;j<10;j++)
    {
        //
    }
}

goto
为了便于理解:禁用goto

 

*****************************************************************************************

     ---函数编写规范---

 1.自己的代码得边写边注释,每个函数必须有注释。
 加头:/***********************
  *FunName             :
  *CreateDate          :
  *Author/Corporation  :
  *Description         :
  *Param               :
  *ReturnCode          :
  ************************/

       2.修改别人的代码的时候不要轻易删除,得注释掉后另写。
  /* liaoyi 2013-9-21 start */

  /* liaoyi 2013-9-21 end */


       3.函数定义结束后,需要加空行。
       4.函数体内,变量定义和函数语句之间需要加空行。
  5.逻辑上不同作用的代码放一起,不同作用的用空行。

  6.函数参数名字,返回类型不要省,没有用void
     void fun(void)

       6.合理缩进,使用4个字符缩进量,不要使用TAB,不同编译器防止混乱。
   if(0==b)
   {
            a=10;
   }
   else
   {
            a=20;
        }


   7.长表达式得分行写,操作符放前头。
   8,运算表达式不要太复杂,多用#define,优先级括号不要省。


 函数设计规范:
 1.返回类型void时,不能用return,用return时不要用多个,用临时变量保存返回值,在函数结尾统一    返回。
   返回类型不能与函数名在语义上冲突 如int getchar(void); 
 2.形参名也应该有意义,如:_ip,_len,strDest,strSrc等。
      3.输入的参数在调用函数之前,或者调用之后(入口检验用assert宏),必须错误检查,是否为0等。
 4.参数是指针,如果仅用作输入,用const防止意外修改。
  int fun(const int *p)
 5.局部变量避免重用函数名,不能返回地址,
 6.少用static静态局部变量。
      7.尽量少用全局变量。
      8.指针运算只能在指向同一数组上。不同数组结果未知。
 
      8.少用:errno,<signal.h>, <stdio.h>, <stdlib.h>,<time.h>尤其是嵌入式产品中。

*****************************************************************************************
     ---注释规范---
1.注释:/* */ ,//
  /**/ :1.会被编译器用空格代替
   int/*...*/i;   ->对,解析为空格
        in/*...*/t i;  ->错。
   2./*总是和离它最近的*/配对,所以不能嵌套。
       3.y=x/*p,这里编译器解析/*为注释的开始。
 
   //: 双引号中都被解析为字符串常量
 char *s="abcdef   //hijk ";

2.注释规范:
   1.编写代码边注释
   2.注释简单直观,代码右边或上面,不要在代码中间或代码下面注释。
   3.全局数据必须加注释。
   3.注释尽量用英文。
   4.复杂的分支,循环要加注释:end “if(...)”。

3.反斜杠:‘\’
  1.断行连接符,编译器自动将下一行字符连接到上一行。注意:反斜杠后和下一行前不能有空格。
  2.转义字符, /n,/t,/a
    //,/‘,
              /ddd,/xhh,八进制和十六进制ASCII码,可表示任意一个C字符集中符号。

*****************************************************************************************
     ---内存管理---

野指针:定义了一个指针,没有给它初始化,里面是一个随机地址,容易出现内存错误。

常见内存错误:
1.内存泄露:内存分配后没有释放
malloc: char *p=(char *)malloc(100*sizeof(char));
 1.分配后必须强制转换为需要的类型
      2.非配的大小用sizeof提高可移植性
      3.malloc的内存是堆中剩余的连续内存,不足时申请会失败,返回NULL。所以必须用if(NULL!=p)验证
 4.malloc(0)也会返回一个地址,但是无法使用大小为0的内存。这时if(NULL!=p)不起作用。

free:断开指针变量与这块内存的关系,操作系统可销毁。
     1.指针中的地址并没有改变,堆的内存中的值也没有改变,只是不能用了而已。
     2.molloc一次必须free一次。free少了内存泄露,free多了会出错。
     3.free后一定要加 p=NULL,把野指针拴住。
2.内存崩溃:
     1.野指针访问了不能访问的内存:定义后必须初始化。int *p=NULL;
     2.数组等访问越界
     3.使用了已经释放的内存
2.内存碎片:不断的malloc和free,导致内存碎片多,无法申请大的内存。
           所以,少用malloc和free!

 


*****************************************************************************************

     ---文件结构---

头文件,源文件均可包含:
/************************************************************************
*File Name           :FN_FileName.h
*Copyright           :2003-2008 XXXX Corporation,All Rights Reserved.
*Module Name         :DrawEngine/Display
*CPU                 :ARM7
*RTOS                :Tron
*Create Date         :2008/10/01
*Author/Corporation  :WhoAmI/yourcompany name
*AbstractDescription :Place some descriptionhere.

*--------------------------RevisionHistory-------------------------
*No Version Date     Revised By  Item          Description
*1  V0.95   08.05.18 WhoAmI      abcdefghijklm  WhatUDo
*
************************************************************************/


头文件:

#ifndef  __FN_FILENAME_H
#define  __FN_FILENAME_H

#define D_DISP_BASE

#include "IncFile.h"

#define  MAX_TIMER_OUT  (4)

typedef structCM_RadiationDose
{
   unsigned charucCtgID;
   charcPatId_a[MAX_PATI_LEN];
}CM_RadiationDose_st,*CM_RadiationDose_pst;

unsigned intMD_guiGetScanTimes(void);


#endif


源代码:

#define  D_DISP_BASE

#include "IncFile.h"

typedef struct CM_RadiationDose
{
unsigned char ucCtgID;
char cPatId_a[MAX_PATI_LEN];
}CM_RadiationDose_st, *pCM_RadiationDose_st;

unsigned int MD_guiGetScanTimes(void);

extern unsigned int MD_guiHoldBreathStatus;

static unsigned int nuiNaviSysStatus;

Function Define Section

 

  
可移植性: