您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 单片机C语言编程规范和范例
前言几乎没有任何一个软件,在其整个生命周期中,都由最初的开发人员来维护;而且一个产品通常由多人协同开发,如果大家都按各自的编程习惯,其可读性将会比较差,这不仅给相互间代码的理解和交流带来障碍,而且增加维护阶段的工作量,同时不规范的代码隐含错误的可能性也比较大。所以对于公司或团队来说,规范的编程都至关重要。规范的编程可以改善软件的可读性,让开发人员尽快而彻底地理解新的代码,从而最大限度的提高团队开发的效率,而且长期的规范性编程还可以让开发人员养成良好的编码习惯,甚至锻炼出更加严谨的思维。本规范从可读性、可维护性和可移植性对编程做了一些规定,1-4章对于C语言编程的规范在一定程度上具有普遍性,为强制执行项目。第5章更侧重于单片机C语言的编程规范,只是作为建议,可根据习惯取舍。第一章排版1.1在函数的开始,结构的定义、判断等语句的代码以及case语句下的情况处理语句,都要采用缩进风格编写,缩进的空格数为4个。说明:用不同的编辑器读程序时,因TAB键所设置的空格数目不同,会造成程序布局不整齐,建议对齐只使用空格键,不使用TAB键。示例:函数或过程的开始voidInitSystem(void){...//programcode}示例:case语句下的情况处理语句switch(link_data.index){case1:...//programcodecase2:...//programcodedafault:...//programcode}1.2变量说明之后、相对独立的程序块之间必须加空行。示例:规范书写intrepssn_ind;charrepssn_ni;/*两程序块间加空格*/if(!valid_ni(ni)){...//programcode}/*两程序块间加空格*/repssn_ind=ssn_data[index].repssn_index;repssn_ni=ssn_data[index].ni;1.3不允许把多个短语句写在一行中,即一行只写一条语句。示例:不符合规范Rect.length=0;rect.width=0;实例:规范书写Rect.length=0;rect.width=0;1.4if、for、do、while、case、switch、default等语句各自占一行,且if、for、do、while等语句的执行语句部分无论多少都要加括号{}。示例:不符合规范if(pUserCR==NULL)return;示例:规范书写if(pUserCR==NULL){return;}1.5有较长的表达式、语句或参数,则要进行适应的划分,一行程序以小于80字符为宜,不要写得过长。1.5.1长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐。示例:规范书写bReportOrNotFlag=((cTaskNoMAX_ACT_TASK_NUMBER)&&(N7statStatItemValid(cStatItem)&&(acActTaskTable[cTaskNo].cResultData!=0));if((cTaskNoMAX_ACT_TASK_NUMBER)&&(N7statStatItemValid(cStatItem)){...//programcode}1.5.2若函数中的参数较长,也要进行适当的划分。示例:规范书写N7statStrCompare((BYTE*)&cStatObject,(BYTE*)&(acAdcTaskTable[cTaskNo].cStatObject),Sizeof(_STAT_OBJECT));N7statFlashActDuration(cStatItem,cFrameID*STAT_TASK_CHECK_NUMBER+index,CStatobject);1.6程序块的分界符‘{’和‘}’应各自独占一行并且位于同一列,同时与引用它们的语句左对齐。在函数体的开始、结构的定义、枚举的定义以及if、for、do、while、case语句中的程序都要采用如上的缩进方式。示例:不符合规范if(...){...//programcode}voidExampleFun(void){...//programcode}示例:规范书写if(...){...//programcode}voidExampleFun(void){...//programcode}1.7在两个以上的关键字、变量、常量进行对等操作时,它们之间的操作符之前、之后或者前后要加空格;进行非对等操作时,如果是关系密切的立即操作符(如‘-’、‘.’),后不应加空格。1.7.1逗号、分号只在后面加空格。示例:规范书写inta,b,c;for(i=0;i10;i++){...//programcode}1.7.2比较操作符,赋值操作符“=”、“+=”,算术操作符“+”、“%”,逻辑操作符“&&”、“&”,位域操作符“”、“^”等双目操作符的前后加空格。示例:规范书写if(current_time=MAX_TIME_VALUE)a=b+c;a*=2;a=b^2;1.7.3“!”、“~”、“++”、“--”、“&”(地址运算符)等单目操作符前后不加空格。示例:规范书写p-id=++pid;//“-”指针和“++”前后不加空格1.7.4if、for、while、switch等与后面的括号间加空格,使if等关键字更为突出、明显。示例:规范书写if(a=b&&cd)第二章注释2.1一般情况下,源程序有效注释量必须在20%以上,注释的内容要清楚、明了,含义准确。说明:注释的原则是有助于对程序的阅读理解,注释不宜太多也不能太少。注释语言必须准确、易懂、简洁,防止注释二义性。2.1.1尽量避免在注释中使用缩写。说明:在使用缩写时或之前,应对缩写进行必要的说明,错误或含义不清的注释不但无益反而有害。2.1.2注释的语言要统一说明:注释应考虑程序易读,出于对维护人员的考虑,使用的语言若是中、英兼有的,建议多使用中文,除非能用非常流利准确的英文表达。2.2边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性,不再有用的注释要删除。2.3在代码的功能、意图层次上进行注释,提供有用、额外的信息。示例:如下注释意义不大/*ifbReceiveFlagisTRUE*/if(bReceiveFlag)...//programcode示例:注释给出了额外有用的信息/*ifMTPreceiveamessagefromlinks*/if(bReceiveFlag)...//programcode2.4注释的格式与位置应统一、整齐。说明:注释应与其描述的代码接近,应放在其上或右方相邻位置,不可放在下面。2.4.1注释格式尽量统一,建议使用“/*……*/”。2.4.2注释与所描述内容进行同样的缩排,如果注释放于代码上方则需与其上面的代码用空行阁开。示例:不符合规范voidExampleFun(void){/*codeonecomments*/CodeBlockOne/*codetwocomments*/CodeBlockTwo}示例:规范书写voidExampleFun(void){/*codeonecomments*/CodeBlockOne/*与上面的代码用空行阁开*//*codetwocomments*/CodeBlockTwo}2.4.3避免在一行代码或表达式的中间插入注释。说明:除非必要,不应在代码或表达式中间插如注释,否则容易使代码可理解性变差。2.4.4注释应整齐、统一,放于代码右边的注释,应左对齐。示例:规范书写CodeBlockOne;/*codeonecomments*/CodeBlockTow;/*codeTowcomments*/CodeBlockThree;/*codeThreecomments*/2.4.5在程序块的结束行右方加注释标记,以表明某程序块的结束。说明:当代码段较长,特别是多重嵌套时,这样做可以是代码更清晰,更便于阅读。示例:规范书写if(...){...//programcodewhile(indexMAX_INDEX){...//programcode}/*endofwhile(indexMAX_INDEX)*/...//programcode}/*endofif(...)*/2.5对于所有的定义或声明,如果其命名不能充分自注释的,都必须加以注释。2.5.1有物理含义的变量、常量、宏的声明说明:如果其命名不能充分自注释,在声明时都必须加以注释,说明其物理含义。变量、常量、宏的注释应放在其上方相邻位置或右方。示例:规范书写/*activestatistictasknumber*/#defineMAX_ACT_TASK_NUMBER1000intiActTaskSum/*activestatistictasksum*/2.5.2数据结构的声明说明:包括数组、结构、枚举等,如果其命名不能充分自注释,必须加以注释。对数据的注释应放在其上方相邻位置,结构中每个域的注释放在此域的右方,并左对齐。示例:规范书写/*sccpinterfacewithsccpuserprimitivemessagename*/enumSCCP_USER_PRIMITIVE{N_UNITDATA_IND,/*sccpnotifysccpuserunitdatacome*/N_NOTICE_IND,/*sccpnotifyusertheNO.7networkcannot*//*transmissionthismessage*/N_UNITDATA_REQ,/*sccpuser’sunitdatatransmissionrequest*/};2.6全局变量要有较详细的注释,包括对其功能、取值范围、存取时注意事项等的说明。示例:规范书写/*************************************************************************Description:**TheErrorCodewhenSCCPtranslateGlobalTitlefailure**Define:**0:Success**1:GTTableerror**2:GTerror**others:nouse**Notes:**OnlyfunctionSCCPTranslate()inthismodualcanmodifyit**Othermodulecanvisititthroughcallthefunction**GetGTTransErrorCode()*************************************************************************/BYTEg_GTTranErrorCode;2.7函数头部应进行注释,列出:函数功能、参数、返回值及注意事项等。示例:规范书写/*************************************************************************Description:**USARTtransmitdataarray**Arguments:**pTX:TheBYTEpointerofdataarrayforUSARTtransmission**TXNumber:Dataarraysize,1-255isavalid**Returns:**TX_STA_SUCCESS(0):TransmitSuccess**TX_STA_BUSY(1):TXmodulebusy**TX_STA_ERR(2):TXerror**TX_STA_EMPTY(3):TXdataarrayisempty**others(4-255):nouse**Notes:*******************************************************
本文标题:单片机C语言编程规范和范例
链接地址:https://www.777doc.com/doc-4436280 .html