您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > 嵌入式系统中的C语言编码规范
嵌入式系统中的C语言编码规范2004-1文件标题页码第1页文件编号技术标准TechniqueStandard1范围本文件规定了书写程序代码时的一般规则和要求。本文件适用于研发中心监控硬件室的嵌入式程序开发过程。2原则2.1目的为了统一在项目开发中的程序编码风格,提高代码的编写质量和可重用性,使代码具有如下的特点:可移植性,一致性,易维护性,易理解性,整洁、简朴和清晰。2.2基本原则1)书写的所有C语言代码应遵守ANSIC规范。2)保持代码简洁。3)语言描述直接、清晰。4)风格要保持一致。5)要避免语句复杂。6)慎重使用GOTO语句。7)及时更新旧代码。8)注释要通俗易懂,不产生歧义。3源文件3.1注意代码行的宽度代码行的宽度不可太长,以避免代码在显示器上显示时和被打印出来后的清单不便阅读。较长的语句要分成多行书写,划分出的新行要进行适当的缩进,使排版整齐,语句易读。如果能够做到:“长表达式在低优先级操作符处划分新行,操作符放在新行之首”,就最好。3.2关于制表符(TAB)因为TAB符(ASCII码为0x09)在不同的计算机和打印机上所表现的可能不同,使得维护不便。要使用合适数量的空格符(ASCII码为0x20)代替TAB来对齐文字。3.3使用4个空格的缩进方式程序块要采用缩进风格编写,缩进的空格数为4,缩进只使用空格键,不用TAB键。3.4程序块的分界符程序块的分界符(大括号“{”和“}”)应各独占一行并且位于同一列,同时与引用它们的语句左对齐。在函数体的开始、结构体的定义、联合体的定义、枚举的定义以及if、for、do、文件标题页码第2页文件编号技术标准TechniqueStandardwhile、switch、case语句中的程序都要采用如上的缩进方式。3.5关于文件头和函数头部的注释源文件(包括说明性如:头文件.h文件、.inc文件、.def文件、编译说明文件.cfg等)头部应放置注释文字,注释必须列出:版权说明、版本号、完成日期、作者、内容、模块目的/功能、主要函数及其功能、与其它文件的关系、修改日志等,头文件的注释中还应有函数功能简要说明。函数头部也应进行注释,注释时要列出:函数名、函数的目的/功能、输入参数、输出参数、返回值、调用关系(函数、表)等(必要时要举例说明函数的使用方法)。3.6文件书写的层次实现文件(.C文件)的层次:FileheadingRevisionhistory#include#defineconstantsMacrosLocaldatatypesLocalvariablesLocaltablesLocalfunctionprototypesGlobalfunctionsLocalfunctions声明文件(.H文件)的层次:FileheadingRevisionhistory#defineconstantsGlobalmacrosGlobaldatatypesGlobalvariablesExternalsGlobalfunctionprototypes3.7用注释将各个主要段分隔使用如下的方式分隔:/********************************************************************************DataTypes*******************************************************************************/typedefunsignedcharBOOLEAN;/********************************************************************************Prototypes*******************************************************************************/文件标题页码第3页文件编号技术标准TechniqueStandardBOOLEANTaskRdy(void);空行起着分隔程序段落的作用,空行得体(不过多也不过少)将使程序的布局更加清晰。3.8必须要采取一定的措施防止头文件被重复引用比如在使用HIWARE的HI-CROSS+编译器时可以使用如下的方法:#ifndef_MAIN_H#define_MAIN_HBodyoftheheaderfile.#endif3.9使用#include用#include〈filename.h〉格式来引用标准库的头文件(编译器将从标准库目录开始搜索),用#include“filename.h”格式来引用非标准库的头文件(编译器将从用户的工作目录开始搜索)。4注释4.1原则上使用中文注释。4.2使每行注释都有其价值一般情况下,源程序有效注释量必须在20%以上。写注释时要明智些!如果一段代码的逻辑关系很复杂,注解将有助于别人理解代码的意图。但如果逻辑关系直线向前,避免加上并非必须的注解。注释使用的语句要简洁,表达要清晰、准确,不要使人产生歧义,不可喧宾夺主。4.3分开注释和代码,而不要混在一起。以免阅读代码时注意力被分散尽可能少的在代码语句中嵌入注释,不要象下面的例子中的那样。voidClkUpdateTime(void){/*DONOTcommentlikethis!*//*Updatetheseconds*/if(ClkSec=CLK_MAX_SEC){ClkSec=0;/*Updatetheminutes*/if(ClkMin=CLK_MAX_MIN){ClkMin=0;/*Updatethehours*/if(ClkHour=CLK_MAX_HOURS){ClkHour=0;}else{ClkHour++;}}文件标题页码第4页文件编号技术标准TechniqueStandardelse{ClkMin++;}}else{ClkSec++;}}4.4注释要醒目,要使其易于同代码区分出来不要象下面的例子中的那样。/*ThistypeofcommentcanleadtoconfusionespeciallywhendescribingafunctionlikeClkUpdateTime().Thefunctionlookslikeactualcode!*/4.5尽可能将注释放在语句尾部,并且对齐注释。4.6使用合适的方法来屏蔽暂时不执行的代码块可以使用如下的方法来屏蔽暂时不执行的代码块,而不要修改注释。#if0/*Commentsoutthefollowingcode*/#defineDISP_TBL_SIZE5/*Sizeofdisplaybuffertable*/#defineDISP_MAX_X80/*Max.numberofcharactersinXaxis*/#defineDISP_MAX_Y25/*Max.numberofcharactersinYaxis*/#defineDISP_MASK0x5F#endif5命名规则5.1总约定直观且可以拼读,可望文知义。标识符最好采用英文单词或其组合,便于记忆和阅读。切忌使用汉语拼音来命名。#defineconstants:#definemacros:typedefs:enumtags:所有的字母都用大写形式;标识符中的各个单词之间用下划线分开;Examples:DISP_BUF_SIZE,MIN(),MAX(),etc.Localvariables(i.e.functionscope):所有的字母都用小写形式;标识符中的各个单词之间用下划线分开;Usestandardnames(e.g.i,j,k用来作循环变量,p作指针变量等)文件标题页码第5页文件编号技术标准TechniqueStandardFilescopevariables:用模块名称作前缀并使用下划线与后面分开;标识符中的各个单词之间用首字母大写的方法来分隔开;要定义为静态;Examples:Disp_Buf[],Comm_Ch,etc.Globalvariables:用模块名称作前缀;标识符中的各个单词之间用首字母大写的方法来分隔开;Examples:DispMapTbl[],CommErrCtr,etc.Localfunctions:用模块名称作前缀并使用下划线与后面分开;标识符中的各个单词之间用首字母大写的方法来分隔开;要定义为静态;Example:staticvoidComm_PutChar()Globalfunctions:用模块名称作前缀;标识符中的各个单词之间用首字母大写的方法来分隔开;Example:voidCommInit()5.2宏和自定义的数据类型,所有的字母都用大写形式。5.3尽量避免局部变量与全局变量同名,如果必须同名一定要使用注释来说明。不要出现仅靠大小写区分的相似的标识符。5.4用大写首字母的方式来分开名字中的几个词。5.5使用公认的缩写(包括国际通用和项目专用的)经常用到的程序术语约定表可见附录。5.6在命名时使用“模块名-对象-动作”、“形容词-名词”或“名词”的格式。6关于数据类型6.1所有的自定义数据类型都应该使用大写字母标识符中的各个单词之间用首字母大写的方法来分隔开。6.2使之便于移植可以采用如下的方法:typedefunsignedcharBOOLEAN;/*Logicaldatatype(TRUEorFALSE)*/typedefunsignedcharINT8U;/*Unsigned8bitvalue*/typedefsignedcharINT8S;/*Signed8bitvalue*/typedefunsignedshortINT16U;/*Unsigned16bitvalue*/typedefsignedshortINT16S;/*Signed16bitvalue*/文件标题页码第6页文件编号技术标准TechniqueStandardtypedefsignedshortINT32U;/*Unsigned32bitvalue*/typedefsignedshortINT32S;/*Signed32bitvalue*/typedefsignedshortINT64U;/*Unsigned64bitvalue(ifavailable)*/typedefsignedshortINT64S;/*Signed64bitvalue(ifavailable)*/typedeffloatFP32;/*32bit,singleprec.floating-point*/typedefdoubleFP64;/*64bit,doubleprec.floating-point*/6.3数据作用范围如果数据只在执行文件(.C文件)中使用,就一定要定义在此执行文件中。如果是全局变量,就一定要定义在头文件(.H文件)中。7层次7.1每行只写一条语句。如:DispSegTblIx=0;DispDigMsk=0x80;而不是:DispSegTblIx=0;DispDigMsk=0x80;7.2关于空格7.2.1函数参数列表中的逗号之后要有一个空格。如下所示:DispStr(x,y,s);7.2.2分号之后要有一个空格。如下所示:for(i=0;i10;i++)7.2.3单目运算符在运算符与操作的对象之间不要有空格。如下所示:!value~bits++ij--(INT32U)x*ptr&xsizeof(x)7.2.4双目运算符和三目运算符,在运算符与操作的对象之间要有一个空格。如下所示:c1=c2;x+yi+=2;n0?n:-n;abc=27.2.5下面的这些操作不要加空格:操作内容举例文件标题页码第7页文件编号技术标准TechniqueStandard-结构指针p-member.成员引用s.member[]数组下标a[i]7.3函数调用语句函数调用语句中,在函数名和圆括号之间不要放空格。如下所示:DispInit();7.4关键词在if、
三七文档所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
本文标题:嵌入式系统中的C语言编码规范
链接地址:https://www.777doc.com/doc-4806994 .html