首页 > 代码库 > 编程规范基础学习笔记
编程规范基础学习笔记
基本原则:
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
可移植性: