您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > 嵌入式C语言编码规范
3Sept.2008©NeusoftConfidential嵌入式C语言编码规范规范内容一、引言二、规范1、文件内部构成2、命名规范3、标识符和常量4、类型和类型转换5、初始化、声明和定义6、控制语句和表达式7、函数8、指针和数组9、结构与联合10、预处理指令一、引言嵌入式系统在各行各业都得到了广泛应用,C语言的使用也越来越体现出广泛性,因此嵌入式软件的安全可靠性变得尤为重要。制定本规范的目的与意义在于:1、树立良好的编程习惯和编程思路,摒弃那些可能存在风险的编程行为。保证编写出安全健壮的代码,进而保证嵌入式产品的安全性、可靠性。2、使编写的代码更加容易阅读、容易理解而且容易维护。3、良好的编程风格是提高程序可靠性非常重要的手段,也是大型项目多人合作开发的技术基础。4、遵循良好的共通的编码规范,也是提高编码能力,保证软件工程这个阶段质量的一个重要手段。同时也是衡量一个组织软件开发能力的一个重要指标。二、规范1、文件内部构成用于存储源代码的C程序文件可以分为两类:源文件和头文件。源文件和头文件中包含的内容是不同的。源文件主要包括以下内容:•只在本文件内部使用的(对外部隐藏的)类型;•只在本文件内部使用的(对外部隐藏的)常量;•只在本文件内部使用的(对外部隐藏的)宏定义;•全局变量和文件级(static)变量的定义;•函数原型声明和函数定义;•包含文件部分,文件头的说明,函数头的说明。头文件中包含如下内容:•提供给外部参照的类型;•提供给外部参照常量;•提供给外部参照宏定义;•提供给外部参照(全局)函数原型声明;•提供给外部参照全局变量的外部声明;•包含文件部分,文件头的说明。但头文件中不要定义变量。/********************************************************************************FileName:DP_DrawE.c*ModelName:MF7878/R/J*ModuleName:DrawEngine/Display*uCom:MitsubishiM16C/80series**CreateDate:1999/10/01*Author/Corporation:WhoAmI/NAS**AbstractDescription:Placesomedescriptionhere.**------------------------------RevisionHistory---------------------------------*NoVersionDateRevisedByItemDescription*1V0.9500.05.18WhoAmI[NAS]abcdefghijklmWhatUDo********************************************************************************/Source/HeaderFileHeaderSection各部分内容的含义说明,请参考下面内容。1)文件名信息;2)适用的产品型号(Model)名称:可以是多个型号;3)所属的模块(Module)名称:当模块很大时,可以考虑在大模块内增加子模块的标示;4)适用的处理器(μCom)型号:可以是多个型号;5)预先包含头文件:只有在头文件的描述中使用,注明包含本文件之前应该首先包含的头文件;6)文件创建日期;7)文件创建者/公司名称;8)概要描述:概要的描述文件的功能、构成等信息,如果存在特殊的考虑,也请注明;9)修改履历,其中请标明:1)修改序号(No.);2)修改对应版本号(Version);3)修改日期(Date);4)修改人(RevisedBy);5)修改项(Item);6)修改描述(Description):请注明修改的原因和对策,如果存在特殊的考虑,也请注明;注意点:修改履历的纪录一般在V0.80之后开始。但是,如果目前ver0.80的完成度和质量普遍很低,因此在具体的项目中可以考虑提高开始纪录修改履历的版本号。文件头说明实例2命名规范规范2.1关于文件标识符命名规则,请遵照以下规范:文件标识符分为两部分,即文件名前缀和后缀。格式如下:×××……××.×××1)文件名前缀表示该文件的内容或作用,可以由项目组成员统一约定。最好不要超过8个字符;文件名前缀的最前面要使用范围限定符——模块名(文件名)缩写;2)文件名后缀表示该文件的类型,该部分最多为3个字符:1)源文件:.c;2)头文件:.h;3)其它类型文件:如.tbl文件等,使用之前进行统一规定。3)前缀和后缀这两部分字符应仅使用字母、数字和下划线。文件标识的长度不能超过32个字符,以便于识别;4)本规范建议文件名全部使用大写。规范2.2关于模块标识符命名规则:1、模块名就是范围限定符,各种全局标识符(文件名、全局函数名、全局变量名等)的命名,必须使用范围限定符作为前缀。2、模块名必须进行适当的缩写。例如StandBy模块,省略缩写为STBY;3、模块名要求全部为大写。规范2.3关于C标识符命名规则,请按照「标识符前缀」+「含义标识」规范进行命名。「标识符前缀」由以下元素构成,各部分内容需要遵守相应定义:范围限定符前缀+作用域前缀+数据类型前缀+含义标识「标识符前缀」范围限定符前缀的形式为:模块名+下划线,即模块名_2命名规范2命名规范作用域前缀:NO标识符类型作用域前缀1GlobalVariableW2FileStaticVariablen3FunctionStaticVariablefn4AutoVariablea5GlobalFunctionw6StaticFunctionn数据类型前缀:1、参照Microsoft的匈牙利标记法;2、对于用户自定义的类型(enum、struct、union),变量类型不做区分,统一使用“st”。2命名规范No.DataTypePrefixExample1bitbtbitbtVariable;2booleanbbooleanbVariable;3charccharcVariable;4intiinti;5short[int]sshort[int]sVariable;6long[int]llong[int]lVariable;7unsigned[int]uunsigned[int]uiVariable;8doubleddoubledVariable;9floatffloatfVariable;10pointerpvoid*pvVariable;11voidv/vdvoid*pvVariable;12arrayofacharacVariable[TABLE_MAX];2命名规范含义标识的命名:1、各单词的开头用大写字母,其余用小写字母,省略用语除外;2、禁止在数据命名的一部分插入数字(数学公式例外);3、进行命名的时候,在充分把握数据对象(变量、函数等)的内容含义的基础上,进行能明确显示其内容的命名(见名知意)。1)变量含义标识符构成:目标词+动词(过去分词)+[状语]+[目的地];2)函数含义标识符构成:动词(一般现时)+目标词+[状语]+[目的地];Example:变量:DataGotFromCD从CD中取得的数据DataDeletedFromCD从CD中删除数据函数:GetDataFromCDDeleteDataFromCD2命名规范标识符命名举例NO分类举例说明1变量定义具有全局作用域INT8UAMM_wucDDMDataEnable;2变量定义具有局部作用域INT8UaucBeepType;3函数定义具有局部作用域staticvoidnvdAPIAmmKeyOutUp(void)4结构体定义具有局部作用域typedefstruct{INT8UucSize;INT8UaucReceiverID[RECEIVERID_SIZE];INT8U*pucReceiverBuff;}SDARS_DispReceiverID_st,*pSDARS_DispReceiverID_st;pSDARS_DispReceiverID_stapstDispReceiverI3标识符和常量规范3.1标识符的内部有效字符和外部有效字符不能多于31。便于编译器识别,代码清晰易读,并保证可移植性。规范3.2具有内部作用域的标识符,不应与具有外部作用域的标识符重名,这会隐藏了外部标识符(同一文件)。在嵌套的范围中使用相同名称的标识符会使得代码非常混乱,例如:INT16Ui;/*该变量具有外部作用域*/{INT16Ui;/*定义了一个具有内部作用域的变量*/i=3;/*NG:外部作用域变量被隐藏,容易引起代码混乱*/}规范3.3静态变量和全局变量的标识符不能重名(不同文件)。3标识符和常量[例][file1.c]staticINT8UnucVar1;/*NG:多个file中进行了定义*/voidnvdfunc1(void){…}[file2.c]INT8UnucVar1;/*NG:多个file中进行了定义*/INT8UnucVar2;voidnvdfunc2(void){…}3标识符和常量规范3.4不应使用八进制常量(零除外)和八进制转义序列。任何以0零开始的整型常量都被看做是八进制的,所以这是危险的。如在书写固定长度的常量时,例如下面为3个数字位做数组初始化时,将产生非预期的结果。(052是八进制的即十进制的42):code[1]=109+100;/*equivalenttodecimal209*/code[2]=100+052;/*equivalenttodecimal142*/4类型和类型转换规范4.1不要单独的使用char类型,应该使用signedchar和unsignedchar类型替代。[例]charaacVar[]=“abcde”;/*NG*/INT8UaucVar=234;/*OK*/INT8SascVar=‘a’;/*OK*/规范4.2位域只能被定义为unsignedint或singedint类型。位域的存储空间分配与各编译器的实现有关。如果位域类型扩展(char,short,long等),需要明确说明编译器的支持情况。规范4.3应该使用标明了大小和符号的typedef代替基本数据类型。不应使用基本数值类型char、int、short、long、float和double,而应使用typedef进行类型的定义。typedef类型定义见下页附表。4类型和类型转换No.基本数据类型typedef定义1typedefunsignedcharBOOLEAN;2typedefunsignedcharboolean;3typedefunsignedcharbit;4typedefunsignedcharINT8U;5typedefsignedcharINT8S;6typedefunsignedshortintINT16U;7typedefsignedshortintINT16S;8typedefunsignedlongintINT32U;9typedefsignedlongintINT32S;10typedeffloatFP32;typedef类型定义附表:4类型和类型转换规范4.4signedint类型的位域至少应该为2bits长度,因为signedint类型数据的正负符号要占用一个bit。1bit长度的有符号位域是无用的。例:structstag{signedintuc4_bf1:1;/*NG*/signedintuc4_bf2:4;/*OK*/}规范4.5对于long型的整形常量应该追加后缀u(或U),UL(或ul)。提高代码的可读性。例:INT32UaulVar32x;aulVar32x=aulVar32x+3;/*NG*/aulVar32x=aulVar32x+3u;/*OK*/注意点:对char
本文标题:嵌入式C语言编码规范
链接地址:https://www.777doc.com/doc-3972914 .html