您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > 嵌入式C语言编码风格.ppt
嵌入式C语言编程——编码风格GDAIBCodingStyle目录•简介及说明•语言规则•1.基础•2.数据•3.说明与表达式•4.函数•5.内存及资源•6.源文件•风格指导•7.程序书写•8.命名•9.文档Page2简介及说明•正确性•易维护性•易移植性•代码的高效性编写软件应注意和遵守的基本规则:程序实例floatb,c[10];voidabc(void){floatzongfen=0;intd;for(d=0;d10;d++){if(c[d]0)zongfen+=c[b];b=zongfen/10;}这段程序在做什么?这段程序是否有错误?这程序中存在哪些不良的书写风格?它们可能会引起什么后果?Page3floatb,c[10];voidabc(void){floatzongfen=0;intd;for(d=0;d10;d++){if(c[d]0)zongfen+=c[b];b=zongfen/10;}#defineSTUDENT_NUM10//学生总数floatfAvgScore;//平均分floatfScore[STUDENT_NUM];//分数voidAvgScore(void)/*平均分计算函数*/{inti;floattotal_score=0;//总分for(i=0;iSTUDENT_NUM;i++){//累加计算总分if(fScore[i]0)//遇到负分,记为0分total_score+=fScore[i];}if(STUDENT_NUM0)//计算平均分fAvgScore=total_score/STUDENT_NUM;}有了哪些改进?还有什么地方需要改进?Page4语言规则——基础•编写清晰表达设计思路和意图的代码•针对易读来优化代码,效率优化留给编译器去做•编写可大声朗读的代码•利用注释阐述和解释代码,并进行总结•使用有意义且无歧义的命名方法.(推荐使用全英文的命名)•尽可能使用标准C函数•不将同样的代码使用三次以上,编写相应的函数•让程序自己检查运行中的错误-编写调试代码Page5•谨慎使用GOTO语句•不要修补那些风格差的代码,重写他们•不要比较两个浮点数是否相等•优化代码或调试一旧版本前,备份并记录所做的修改•避免机器及编译器相关的代码,如必需,隔离相关代码•将编译器设为最高警告水平,把每一个警告视为错误来处理•不要直接在程序中直接书写常量,应该使用常量的宏定义语言规则——基础Page6•#include的头文件没有被引用•在同一个编译单元内(一般是一C文件)重复引用同一头文件•在头文件内说明却仅仅在一个C文件中引用•全局变量仅仅在一个C文件中引用.(应该使用static量)•在赋值中,左右两边的数据类型不一样.(如确实必须,应该显式地进行类型转换)•函数返回指向函数内说明的自动变量的指针.(应该使用指向static变量的指针)•删除switchcase语句中的break语句(除非两个或多个case的处理代码是完全一致的,这时应该加以注释。)语言规则——避免使用Page7•两个不同类型指针间的运算•隐含的数据类型转换•隐含的对于变量是否为0的测试比如:“if(a=b)”;正确的写法是“if((a=b)!=0)”•缺少default的switch语句•表达式中假设了运算顺序(不要怕写括号)•忽略函数的返回值,如果函数不需要返回值可使用(void)f();但如果程序中无返回值函数的数量太多,则系统的设计可能有问题语言规则——避免使用Page8•模块间的依赖关系对于开发效率,可测性,可维护性都有很大的影响.良好的依赖关系应该是简单的,层次化的,和非循环的.•函数间传递的参数越少越好,减少模块件的依赖关系和耦合程度,最大程度上实现对模块的封装,将模块内的复杂性屏蔽,而对外提供简洁的数据接口。•尽量减少全局变量的使用,局限在一个c文件中的全局变量应该说明为static。•对于一组在逻辑上相关的变量,应该尽量将他们封装在结构中。语言规则——依赖关系Page9•推荐使用typedef来进行数据类型的说明。•所有不同类型变量间的运算,必须显式地进行类型转换。(这一点对于不同类型的指针间运算尤其重要)•对于没有加unsigned修饰的类型,应该小心处理可能的数据溢出语言规则——类型Page10•在程序(函数或c文件)的开始处对变量进行说明,将相关的变量说明放在相邻的行•变量的说明应该遵循一个变量一行的原则,除非所说明的变量是紧密相关的•将不变的变量说明为const•尽量在变量的说明行中对变量进行初始化•避免不必要的全局变量语言规则——变量Page11•什么时候使用指针?•该变量在其有效期内可能表示不同的对象.•该变量表示一个任意的关系,也即其可能为空.•使用指针可能有更高的效率(关键代码中)或更好的实现•避免无效的指针•假设任何指针都可能为空•使用NULL来比较指针,而不是0,仅有指针才会拥有NULL值•使用NULL来表示指针不指向任何对象;使用0x0表示数值零;使用’\0’表示字符串的结束.语言规则——指针Page12•只有在没有更好的变通情况下使用GOTO语句•确保数组的存取没有越界•假设所有的临时变量再使用完毕后就被立刻清除语言规则——表达式Page13•所有函数的入口参数都必须进行合法性检查•函数间的接口越简洁越好,参数传递应该尽可能的简单•理想的函数应该仅有一个统一的返回点(出口)•对于某个具体的项目而言,函数应该拥有尽量统一的返回值约定•函数的调用者应该检查函数的返回值•过深层次的嵌套调用应该充分考虑系统或该进程的堆栈大小,防止堆栈溢出•每个函数前必须有相应的说明•所有函数的返回类型必须显式的定义,没有返回值的函数应该说明为void语言规则——函数Page14函数前必须有相应的说明-范例/**********************************************************FUNCTIONNAME:test_func**ARGUMENT:*in_arg1:briefdescriptionoftheargument*in_arg2:briefdescriptionoftheargument*in_arg3:briefdescriptionoftheargument**FUNCTION(S)CALLED*function1*function2**GLOBALVARREFERENCED:g_var1,g_var2*GLOBALVARMODIFIED:g_var2**DESCRIPTION:Adetaileddescriptionofthefunctionshouldbelisthere**NOTE:Theinformationshouldbenotedlisthere***************************************************************MODIFICATIONHISTORYmm.dd.yyLingmingDescriptionofthechangesmadetothisfuncChangesshouldbelistinreverseorder*************************************************************/Page15•程序申请内存或资源时,必须检查返回值是否有效•所申请的资源或内存在使用完毕后,必须显式地及时地进行释放•函数内部的局部量中,不应该使用大的数组.(此时应该使用static说明)语言规则——内存及资源Page16•C文件的开始部分,应该有关于本文件的说明(类似函数前的说明)•引用头文件的顺序:遵循先底层后上层的原则(系统头文件→厂商头文件→结构头文件→应用程序头文件)•C源文件中顺序文件说明→头文件的引用→#define语句→结构及枚举说明→全局变量的说明→本地函数(static)说明→全局函数说明及代码(与头文件中的顺序一致)语言规则——源文件Page17•在需要的地方写合适的注释•预编译宏定义语句•每个函数前,说明函数的功能,参数,返回值,出错处理等。•较为复杂的if…else…语句。•大块的,逻辑上独立的代码段,用以说明该会代码的作用•循环语句,说明循环的功能及跳出循环的条件。•全局变量的定义处。•结构定义中的分量。•利用括号来表示运算的优先顺序•每条语句单独占用一行;•不要使用过长的语句,必要时可以换行写•尽量多使用大括号(特别中循环嵌套中)风格——程序书写Page18函数命名、全局变量命名、局部变量命名、宏的命名、文件的命名——称作标识符风格——命名(标识符)标识符的命名要清晰、明了,有明确含义。使用完整的单词或大家基本可以理解的缩写,避免使人产生误解。标识符应当采用英文单词或其组合,切忌使用汉语拼音来命名。坏的命名:inta/Age1/XueshengAge;好的命名:intStudentAge;1、变量名:不同作用域变量的命名要求不同局部变量以小写字母命名;全局变量以首字母大写方式命名(骆驼式);定义类型和宏定义常数以大写字母命名;变量的作用域越大,它的名字所带有的信息就应该越多。如:局部变量:intstudent_age;全局变量:intStudentAge;宏定义常数:#defineSTUDENT_NUM10类型定义:typedefINT16Sint;Page192、不同类型变量的命名(匈牙利命名法)匈牙利命名法是一种命名约定。匈牙利命名法把变量的类型(或者它的预期使用)等信息编码在变量名中。一些常用的匈牙利命名法前缀数据类型前缀例子charccInCharunsignedcharucucOutCharintiiReturnValueunsignedintuiuiControlWordlongllNumberfloatffLengthdoubleddAreaPage203、指针变量的命名对于指针的定义,名称大小写根据指针为全局/局部变量来定,但指针名必须以小写的“p”开头。如:int*pDay;//全局指针int*pday;//局部指针int**ppDay;//指针的指针4、在某一模块中使用的变量,变量名的开始需有模块名如:模块KEY.C中的变量:intiKeyNum;intiKeyNumBuff[10];Page215、函数名函数名的命名应象全局变量一样采用首字母大写方式(骆驼式)函数名的开始应以“模块名_”的格式注明函数所属模块。例如:(1)KEY.C模块的函数voidKEY_Init(void);voidKEY_StartScan(void);voidKEY_StopScan(void);(2)TMR.C模块的函数voidTMR_Init(void);voidTMR_Start(TMR_IDtmr);voidTMR_Stop(TMR_IDtmr);Page22名字的合理选择可以帮助理解程序。同样,也应该以尽可能一目了然的形式书写语句。这就像保持书桌整洁可以使你容易找到东西一样。1、用缩进格式书写代码函数或过程的开始、结构定义及循环、判断等语句中的代码都要采用缩进;缩进的空格数为4个;使用空格键,不使用TAB键;程序块的分界符(‘{’和‘}’)应各独占一行。例:for(i=0;iSTUDENT_NUM;i++){//累加计算总分if(fScore[i]0){//遇到负分,记为0分total_score+=fScore[i];}}风格——排版Page232、其他书写格式——长语句较长的语句(多于80字符)要分成多行书写;长表达式要在低优先级操作符处划分新行,操作符放在新行之首;划分出的新行要进行适当的缩进,使排版整齐,语句可读;不允许把多个短语句写在一行中,即一行只写一条语句。例:修改前:MeasData.TransT[dir]=TransT[dir]*SetData.Filter+TransT[dir]*(1-SetData.Filter);修改后:MeasData.T
本文标题:嵌入式C语言编码风格.ppt
链接地址:https://www.777doc.com/doc-2851983 .html