浙江某轨道交通工程公司软件编码规范

上传人:苏**** 文档编号:130906895 上传时间:2022-08-05 格式:DOC 页数:27 大小:283.50KB
收藏 版权申诉 举报 下载
浙江某轨道交通工程公司软件编码规范_第1页
第1页 / 共27页
浙江某轨道交通工程公司软件编码规范_第2页
第2页 / 共27页
浙江某轨道交通工程公司软件编码规范_第3页
第3页 / 共27页
资源描述:

《浙江某轨道交通工程公司软件编码规范》由会员分享,可在线阅读,更多相关《浙江某轨道交通工程公司软件编码规范(27页珍藏版)》请在装配图网上搜索。

1、浙江浙大网新众合轨道交通工程有限公司软件编码规范浙江浙大网新众合轨道交通工程有限公司 系统研发部 编制审核批准日期方辉刘湘黔文件编号ZHGD-XT-002-0版本号/修改号A/0本文件版权属于本公司所有,未经许可,不得复制引用文档管理信息保密级别普通() 机密( ) 绝密( )保存期限短期( ) 长期() 永久( )文件名称软件编码规范文件编号ZHGD-XT-002-0版本号A/0文档修改记录版本日期修改内容修改人A/02009-10-10新建文件 方辉目录1目的12范围13编码规则14编码风格74.1排版规则74.2命名规则84.3注释规则144.4函数定义214.5变量间的间隔224.6禁

2、止编码中常量出现224.7代码行234.8警告231 目的没有什么软件工程方法学可以保证可靠性代码,但是,遵循正确的编码规则可以显著的减少代码中的错误。鉴于目前实施高可靠性软件开发的现状,我们制定本规范的目的是为了帮助软件开发人员更加深入地理解编码规则,从而辅助大家更好的推动软件编码规则在实际工作中的制定和实施,为了保证所每个项目组编写出的程序都符合相同的规范,便于理解和维护,便于检查、减少出错概率,有助于成员间交流,保证一致性、统一性。本文所定义的规则部分来源于MISRA C-2004,并结合本部门开发与工程实践经验进行了选择。2 范围该规范适用于本公司所有基于C语言开发的安全苛求系统项目。

3、3 编码规则在程序设计中应该遵守以下规则:1) 过程名不能被重用2) 标号名不能被重用3) 源代码应该使用 /*/ 类型的注释4) 字符序列 /* 不应出现在注释中5) 文件中可执行格式化代码行超过1500行6) 一个函数的行数应该控制在50行以内,每一行的长度应该控制80个字以内7) 不能声明函数指针8) else语句不能为空9) 循环体要用大括号括起来10) 在非赋值表达式中不能出现了赋值操作符11) else中的语句要用大括号括起来12) 不能使用goto语句13) 内嵌中不能使用汇编代码14) 过程参数不超过12个15) 参数不能使用未声明类型16) 实参与形参个数要匹配17) 函数不

4、能未被调用18) case语句不能为空19) 不能使用无限循环20) 使用+或者-操作符(一行中不能用多个) 21) 不能使用三重表达式22) 圈复杂度不能大于1023) 不能有未使用的函数参数24) 函数的实参不能是全局变量25) 代码中有不能有多余变量26) 不能存在UR(变量未赋初值就引用)数据流异常27) 不能存在DU(定义后未引用就退出作用域)数据流异常(建议)28) 不能存在DD(定 义后未被引用就被再定义)数据流异常(建议)29) 不能在函数中全局变量使用与局部变量作用类似30) 不能存在未被使用的过程参数31) 函数不能有多入口32) 过程参数不能只有类型没有标识符33) 使用

5、恰当的循环变量类型34) 循环变量必须是局部的35) 不能在函数参数表中使用省略号36) 不能使用setjmp/longjmp37) 不能使用禁用的过程,函数,文件或名称38) 不要在重新定义C+关键字39) 数组使用不要越界40) 在switch语句中不能没有default 语句41) switch语句中的case语句一定要由break语句来终止42) 不能对有符号类型进行移位操作43) 移位运算不能溢出44) 禁止给无符号变量赋负值45) 不使用逗号操作符46) 禁止对实数类型的变量做相等比较操作47) 不使用不起作用的语句48) 禁止switch语句为空49) switch语句中不能只包

6、含default 50) 过程/函数的参数表不能为空51) 返回类型为void的的过程不能出现在表达式中52) void类型的变量不能作为参数进行传递53) 指针不能指向比分配更大的范围54) 无符号的位域不能少于个比特位的空间55) 在头文件前不能有可执行代码56) 宏中不能使用了多个#和#57) 宏定义中不能包含有不允许的项58) 指针的指针不能超过两级59) 不能使用三字母词60) 不要使用宽串文字61) 不要使用八进制数62) 不要使用寄存器变量63) 枚举元素的初始化要完整64) 字符类型要标明是有符号还是无符号65) 不能对变量重命名66) 不能在枚举中重复使用一个名字67) 给变

7、量赋的值与其类型要一致68) 实参和形参类型要一致69) 头文件名不能使用“”、“”和“*”等字符70) 函数返回类型要一致71) 函数和函数的原型的返回要一致72) 函数和函数的原型的形参要一致73) 结构体变量的初始化类型要一致74) 结构体变量初始化的嵌套结构要一致75) 标识符不能超出31字符76) 过程在定义前不能被调用77) 变量在使用前要被声明78) 函数没有定义原型79) 一个文件的变量应该被声明为静态的80) 数组的下标要是整形81) 不能在非switch结构中使用标号82) 用typedef定义的类型名不能被重新定义83) 不能存在潜在的无限循环84) 函数参数定义的结构和

8、调用的结构要一致85) 形参要定义86) 外部变量要有真实的声明87) 源程序中不能使用非标准字符88) 逻辑上关联的表达式需要括号89) 一个表达式不能有多个功能90) 不能使用指针做逻辑比较91) 宏的参数必需要有括号92) 不能使用Basic类型的声明93) 不能使用单行注释/94) 不能使用不正确的终止字符串95) 不能对常量值进行逻辑非的运算96) 主函数必须为int(void)或者int(int,char*)97) 不能使用嵌套注释98) 不能对有符号类型使用位操作99) switch语句的表达式不能是逻辑表达式100) 不能使用abort,exit等函数101) 枚举类型的不能越

9、限使用102) 不能使用前缀“”、“”103) 不能在宏中使用“#”、“#” 104) 在同一个文件中不能有#if没有#endif105) 数组不能没有边界限定106) 参数不能与全局变量同名107) 参数不能与类型或标识符同名108) 不能使用了不允许使用的头文件109) 在整个系统中声明的类型要一致110) 不同的文件中过程名不能被重用111) 在函数内部变量名不能被重用112) 在逻辑表达式中不能使用赋值操作符113) 赋值操作符与“&”或“|”不能连用114) 参数定义不能是KR风格115) 位操作符不能带有布尔型的操作数116) 位操作符不能作用于布尔值117) 结构体中不能使用无名

10、位域118) 不能存在不可实现的循环条件119) 函数原形中的参数与实际定义中的形参要一致120) 不能有无效的 #if表达式121) 函数类型不能使用Volatile或const122) 不能在宏定义中使用全局变量123) 宏定义中不能有一条注释124) 在预处理指示中不能有一条注释125) 不能在循环语句中有多个控制变量126) 不能在宏的内部使用关键字“defined”127) 不能在表达式中使用128) 不能程序预处理后存在欺骗性字符129) 不能宏扩展中有循环130) 不能被调用的过程既没有原型也没有定义131) 变量声名不能很烦琐132) 不能循环有多入口133) 过程调用不能没有

11、原型声明134) 声明语句要另起一行写135) 外部变量应该在头文件的开始声明136) 在if,while,for表达式之间要有空行137) 不能在系统中任何地方程序都没有被调用138) 不能存在被0除139) 宏名称要大写140) 指针名称必须有后缀141) 函数名和库函数名不能相同142) 变量名称不能只有大小写不同143) 不能使用以下划线开始的变量名144) 全局类型不能没有前缀145) 类/结构/联合/枚举的名称不能以小写字符开始146) 带有#define的被包含文件要被保护147) 宏定义不能调用自己148) 在预处理程序中不能被0除149) for循环语句的初始化表达式不能很复

12、杂150) for循环语句的增量表达式不能很复杂151) 不能在头文件中定义函数152) 不能在头文件中定义变量153) #include和文件名之间要有空格154) 指针在使用之前要检查是不是为null155) 不能存在不可达代码156) 注释中不能包含代码157) 不能往没有打开过的文件中写158) 文件指针在退出时要关闭159) Typedef定义的名称不能以小写字母开始160) Switch不能有多个default161) 宏调用时,参数个数要正确162) 标识符使用要一致163) 声明变量不能缺少变量类型164) 结构成员名称不能重用165) 不能强制扩展复杂的整型表达式166) 不

13、能强制扩展复杂的浮点型表达式167) #if扩展不能包含define操作符168) 在#if中不能使用未定义的宏变量169) #include之前不能有非预处理指示170) #include 不能带有非法条款171) 不能像使用宏一样使用函数172) 预处理程序构造不能作为宏参数173) 在预处理程序之后不能有额外的字符174) 在同一个文件中#else不能没有#if 175) 不能位操作带有浮点操作数176) 内存要被释放177) 不能从释放内存读数据178) 不能有矛盾的类型179) if嵌套深度不能大于5180) 参数列表中的逗号之后空格间隔181) 变量名称与类型不能冲突182) 字符

14、串中不能使用空字符183) 宏代码不能超过5行184) 枚举,结构和联合的变量要被typedef185) 识符名称和宏的名称不能一致186) 编译时要把产生的警告给全消除掉187) 禁止在编码中直接出现频率较高的常量,要以宏定义形式来使用188) 定义变量的同时初始化该变量4 编码风格4.1 排版规则(推荐使用) 程序块要采用缩进风格编写,缩进的空格数为4个 循环、判断等语句中若有较长的表达式或语句,则要进行适应的划分 不允许把多个短语句写在一行中,即一行只写一条语句 if, while, for, default, do等语句自占一行 说明由于每个人编码的习惯不一样,因此在缩进时有些可能用空

15、格键来缩进,从而可能会导致源代码在不同的机子上显示出来不整齐,因此统一规定缩进时以Tab键为准。4.2 命名规则(推荐使用)本章节是关于编码上的函数名、变量名等命名规则的制定。 原则n 名字由prefix(前缀)和suffix(后缀)组成。但是,对于本地变量等,没有prefix(前缀)也是可以的。n 在prefix(前缀)和suffix(后缀)之间,用underscore(_)相连接。不可用其他字符来代替underscore(_)。n 在prefix(前缀)和suffix(后缀)之间,也可以存在着subprefix。在这种情况下,各个之间,还是用underscore(_)来连接。n 作为原则,

16、源文件名应成为prefix(前缀)。n 为了能更好区别,不介意subprefix的设置。4.2.1 变量名 规则1. 命名法遵从Hungarian记法。2. 在变量名的前缀部分文字,数字及标记号不能使用。3. 在变量名中,句号和类型说明名字不能使用。4. 变量名的长度不宜太长。5. 不能在同样的适用范围内,使用同样的变量名。6. 变量名单词和变量用途要一致性。7. API函数名、关键字名字等不能使用来命名变量名。 说明1. 在命名变量prefix(前缀)部分时以变量类型的缩写接头词开头书写。在下列中,记载了系统开发中推荐的类型接头词。NO.缩写接头词类型备注1cchar2hshort3iint

17、4llong5ffloat6ddouble7bbool8bybyte9str字符串10uunsignedunsigned int类型则命名为ui11p指针unsigned int指针类型则命名为pui12g全局变量unsigned int全局类型则命名为gui13s静态变量unsigned int静态类型则命名为sui14fp文件指针类型2. 关于在接头词后继续书写的单词,单词的开头以及各个单词的第一个字母都以大写开头的形式。例) iYear uiCnt strName .3. 使用频率较高的单词,在以下表格中罗列出来请参照。No.原单词意思WordNo.原单词意思Word1Count个数Cn

18、t36Location位置Loca2ReturnCode返回值Rtc37Position位置Posi3Relese释放Rel38Name名字Name4Delete删除Del39Administrator管理员Admin5Set设定Set40Period期间Perd6Get取得Get41Result结果Rslt7Put放置Put42List链表List8Show显示Show43Total总计Total9Hide隐藏Hide44Sum总计Sum10Open打开Open45Control控制Ctrl11Close关闭Close46Index索引Indx12Find找到Find47Address地址A

19、ddr13Extend扩张Extd48Clear清除Clr14Insert加入Insrt49Item项目Itm15New新New50Value值Val16Old旧Old51Target对象Trgt17Start开始Start52Subject主题Sbj18End结束End53Year年Year19Quit退出Quit54Month月Month20First第一个First55Day日Day21Last最后一个Last56Hour时Hour22Up上Up57Minute分Min23Down下Down58Second秒Sec24Maximum最大值Max59User用户Usr25Middle中间值

20、Mid60Average平均Avg26Minimum最小值Min61Project工程Proj27Big大Big62Length长度Len28Small小Small63Version版本Ver29Buffer缓冲Buff64Status状态Stat30Temporary临时Temp65Detail详细Dtil31Work工作Work66Sequence顺序Seq32Source发起者Src67Array排列Arry33Destination目的地Dst68Message消息Msg34Application应用Appl69Send发送Send35Operations操作Ops70Receive接

21、收Recv4.2.2 文件名 规则1. 程序名.c2. 程序名_功能名.c3. 共同功能名.c 说明1. 只有在程序中存在着一个源文件,则把源文件名作为prefix,即:程序名.c2. 按各个机能分割开出来的程序机能源文件名,作为subPrefix,即:程序名_机能名.c3. 对于特定的程序不依赖于共通组件的,则把那个共通组件的名字作为prefix,即:共同机能名.c4.2.3 函数名a) 规则1. prefix_word1Word2Word32. prefix_subPrefix_word1Word2Word3b) 说明1. 把源文件名作为prefix 。Word部的记述方法,作为Camel

22、形式。例)在sample.c源文件内的函数,sample_aaaBbbCcc()。例)在sample_dataGet.c源文件内的函数,sample_dataGet_aaaBbbCcc()。2. 在源文件没有分割的情况下,在源文件内设立函数组,这种情况下,要增加subPrefix部分。例)在sample_dataGet.c文件内设立了检索数据的函数组,sample_dataGet_findDB_aaaBbbCcc()。4.2.4 宏定义c) 规则全部以大写字母来书写,并且对于命名的名字要和实践用途要一致,PREFIX_WORD。d) 说明在定义宏的源文件中,以原文件名作为prefix段。例)在

23、sample.c源文件内定义宏,则SAMPLE_ABC。4.2.5 结构体标记名e) 规则t_prefix_word。f) 说明在定义结构体时,结构体标记名以t_开头,后接定义的prefix以源文件名。例)在sample.c源文件中定义的结构体,其标记名如下:struct t_sample_aaa;4.2.6 结构体typedef名g) 规则TPrefix_Word。h) 说明在定义typedef情况下,typedef名的定义以大写T开头,Prefix段以原文件名及后面Word的开头字母都以大写形式。例)在sample.c源文件内,结构体typedef名的定义如下:typedef struct

24、 t_sample_aaaTSample_Aaa;4.2.7 枚举enum定义i) 规则Eprefix_Word。j) 说明枚举enum是存在着多种值的情况下定义的,因此也伴随着typedef的定义。枚举名的定义跟结构体名的定义是一样的,只不过定义的名字以E为开头。例)在sample.c源文件内的枚举enum定义:typedef enumsDataResult1 = 0,sDataResult2,ESample_DataResult;4.3 注释规则(推荐使用)本章节记述了在软件开发过程中文件、函数的header的记载内容及评语。有关注释的全部规约如下:1. 注释的语言最好用英语或中文进行记述

25、,不要用其他语言。2. 不要记述无用的注释。3. 禁止与处理有差异的评语的记述。4.3.1 头文件的全部构成/*-开头部分-*/*-*/预处理块定义/*-*/*-*/Includes导入.h文件/*-*/类或者外部接口函数的声明下面举例了一个具体的例子/*-*(C) COPYRIGHT 2008 BY ZHEDAWANGXIN CORPORATION ALL RIGHTS *RESERVED*Data:2008.6.30*Author:guanwx*Version:v0.01*File:chgNum.h*Note:chgNum.c的头文件,外部接口函数和类的声明。-*/#ifndefCHGNU

26、M_H /*防止chgNum.h被重复引用*/#defineCHGNUM_H/*-*/#include /*引用标准库的头文件*/#include “myheader.h” / 引用非标准库的头文件/*-*/void chgNum_shortToString(); /*全局函数声明*/class CBox /*类结构声明*/;#endif4.3.2 源文件的全部构成以下描述了源文件的全部构成。/*-开头部分-*/更改履历/*-*/Includes导入.h文件/*-*/Macros宏的定义/*-*/Table & Globals内部结构体、全局变量、静态变量的定义/*-*/文件内部函数的原型内部

27、函数的声明/*-*/内部函数内部函数群4.3.3 开头部分源文件的开头部分以下面形式说明:/*-*(C) COPYRIGHT 时间 BY 公司名CORPORATION ALL RIGHTS RESERVED*Data:时间*Author:作者名*Version:版本号*File:文件名*Note:文件作用说明/*-*/下面举例了一个具体的例子/*-*(C) COPYRIGHT 2008 BY ZHEDAWANGXIN CORPORATION ALL RIGHTS *RESERVED*Data:2008.6.30*Author:guanwx*Version:v0.01*File:chgNum.c

28、*Note:在本文件里提供的以下各个函数。* - chgNum_shortToString() short型的数值转换成字符串类型* - chgNum_longToString() long型的数值转换成字符串类型-*/4.3.4 更改履历/*-*时间 作者*说明-*/下面举例了一个具体的例子/*-*2008.6.30 guanwx*新增加函数chgNum_shortToDollar()*修改函数chgNum_shortToString()-*/4.3.5 宏定义的注释宏定义的注释按下面来规定/* 宏定义的说明和注释 */#define MACRO 100#define MACRO 100 /

29、* 宏定义的说明和注释 */4.3.6 内部结构体、全局和静态变量定义对于文件内部结构体、全局、静态变量定义的注释按下来说明/* 结构体的用处说明 */typedef struct t_sampleint iInitFlag; /*标志是否初始化过*/unsigned short uhMsgStat;/* 消息发收的状态消息发收状态值表示- 0:还未发送- 1:已收完- 2:已送完 */ TSample;int giCnt = 0; /*对此全局变量的注释和说明*/int siCnt = 0; /*对此静态变量的注释和说明*/4.3.7 函数开头部分的注释函数的开头部分的注释按以下来说明/*-

30、*Function:函数名* Brief:功能* Param:param1 说明* param2 说明* Retval:返回值*Author:作者*Data:日期-*/ 函数没有带参数时,则只需写void。 函数没有返回值时,则不用写。下面举例了一个具体的例子/*-*Function:chgNum_shortToString* Brief:short型的数值转换成字符串* Param:sNum IN 要变换的对象值* pStr OUT 转换后的字符串* Retval:变换成功时:字符串的长度* 变换失败时:0*Author:guanweixin*Data:2008.6.30-*/unsigne

31、d short chgNum_shortToString(signed short sNum,char *pStr) 4.3.8 函数内部处理的注释在函数内部处理中,基本上以下面两种方式进行注释。/* 注释和说明 */下面举例了一个具体的例子unsigned short chgNum_shortToString(signed short sNum,char *pStr)/* 初期化处理 */* 用0x00预先处理输出时所指向的内存 */* 取得用于输出时所指向内存的地址 */* 输出时所指向内存里的开头符号设定 */* 判定输入数值的正负号 */* 每个对应的ASCII码的转换 */ /* 输

32、出用的参数设定 */ /* 计算字符串的长度 */ /* 字符串长度的返回 */4.4 函数定义(推荐使用) 规则1) 函数所带的参数较多时,要改行描述,要使得参数排版整洁。2) 函数不带参数时,则用void来描述。 说明作成函数存在着较多参数时,则改行来写。不良风格例子良好风格例子int Sample( int iParam1, int iParam2, int iParam3, int iParam4 )int Sample( int iParam1, int iParam2, int iParam3, int iParam4 )函数参数不存在时,参数则用void来描述不良风格例子良好风格

33、例子int Sample()int Sample( void )4.5 变量间的间隔(推荐使用) 规则在写一个变量时,其变量的前后面分别以一个空格键来间隔。 说明如果一个变量与前后面的变量或符号不以空格键来间隔,那么对于源代码的整洁性和可读性可能就会很差。为此,以放入空格键来作间隔的规定。下面的例子。不良风格例子良好风格例子if(iVal1=iVal2)its=iVal1+iVal2;elseiRtc=iVal1-iVal2;if( iVal1 = iVal2 )iRtc = iVal1 + iVal2 ;elseiRtc = iVal1 - iVal2 ;4.6 禁止编码中常量出现(推荐使用

34、) 规则禁止在编码中直接出现频率较高的常量,要以宏定义形式来使用。 说明如果直接在编码中记述常量的话,在修改源代码的时候,修正哪里就比较烦;同时如果在多处编码中有同一个常量要修改,则很可能其中一些就会被遗落。为此,禁止在编码中常量的出现。下面例子。不良风格例子良好风格例子double Sample( double wVal )double wRtc ;wRtc = 3.14159 * wVal ;return wRtc ;#define PI 3.14159double Sample( double wVal )double wRtc ;wRtc = PI * wVal ;return wRt

35、c ;4.7 代码行(推荐使用) 规则1. 一行代码只做一件事情,如只定义一个变量,或只写一条语句。2. 定义变量的同时初始化该变量。 说明这样的代码容易阅读,并且方便于注释。例子如下:不良风格例子良好风格例子/*宽度高度深度*/int width, height, depth; int width = 0;/*宽度*/int height = 0;/*高度*/int depth = 0;/*深度*/X a + b; y = c + d; z = e + f;x = a + b;y = c + d;z = e + f;4.8 警告(推荐使用) 规则编译时要把产生的警告给全消除掉。 说明如果在编译的时候查出来的警告不处理掉,那么程序在用其他编译器编译时有可能会把这些没处理掉的警告当作错误的被处理。为此,规定要除去全部的警告。

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!