版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1编辑器32程序文件的结构32.1 说明32.2 编译宏定义42.3 包含文件42.4 用户数据类型定义42.5 管脚定义52.6 常量52.7 变量52.8 正文62.8.1 正文顺序推荐62.8.2 正文内容62.9 长的常量数组63命名73.1 常量、编译宏命名73.2 变量命名73.3 函数命名84程序的版式94.1 缩进:统一使用编辑器的TAB键进行缩进,同时设定其缩进量为系统默认94.2 空行:相对独立的程序块之间、变量说明之后必须加空行104.3 代码行111.1.1 一行代码只做一件事情111.1.2 if、for. while、do 等语句自占一行111.1.3 程序块的分界
2、符独占一行121.1.4 多运算符的代码行,不使用默认优先级131.1.5 不要使用难懂的技巧性很高的语句134.4 空格144.4.1 必要时留空格,使代码更清晰推荐144.4.2 二元操作符前后留空格144.4.3 一元操作符前后不留空格144.5 长行拆分154.5.1 较长的语句(80字符)要分成多行书写154.5.2 循环、判断等语句要在低优先级操作符处划分新行164.5.3 函数或过程中的参数较长,则要进行适当的划分165全局变量定义时初始化166注释176.1 必须加注释的位置推荐176.2 注释应适量且准确推荐176.3 函数接口的注释格式176.4 变量的注释格式推荐186.
3、5 注释与所描述内容进行同样的缩排196.6 将注释与其上面的代码用空行隔开206.7 程序块结束行加注释推荐207 EEPROM数据保护218程序失效复位处理推荐219检查219.1 数组下标检查219.2 指针检查229.3 易混淆操作符检查229.4 右值变量检查229.5 差1错误检查229.6 变量溢出检查239.7 类型转换检查2311编辑器程序统一使用VC的编辑器。2程序文件的结构如果没有涉及使用平分化的用户文件,通常只能有一个用户主程序文件。用户程序文件的内容按说明、编译宏定义、包含文件、用户数据类型定义、管脚定义、常 量、变量、正文、长的常量数组的顺序编写。2.1说明说明:说
4、明位于用户程序文件的开头,主要内容有:(1)版权信息。(2)文件名称。(3)程序说明:说明程序用途、功能及使用方法等。(4)版本记录。(5)开发环境。示例:版权信息/Copyright (c) 2001, XXXXXX有限公司产品开发部/All rights reserved./文件名称:filenames/程序说明:XXXXX主程序版本记录:/VIOL1、增加警铃输出延时;2、修正初"Bug。作者:冬”时间:本字字字本字字字 5/V100:正式发布。作者:叱率时间:不补字产不产不编译工具:Keil C 6.02.2 编译宏定义说明:同一产品的不同硬件程序和系列产品的程序,应采用编译
5、宏定义,来减少维护的工 作量:2.3 包含文件说明:包含引用的标准库头文件以及用户头文件。用组加1山。<filename.h>格式来引用标 准库的头文件(编译器将从标准库目录开始搜索)。用#植1山。“续通1*11”格式来引用非标准 库的头文件(编译器将从用户的工作目录开始搜索)。示例:#include <lib_header.h>include 4 user_header.h''2.4 用户数据类型定义说明:定义结构、联合、枚举以及其它非标准的数据类型:示例:typedef union MacData联合unsigned char Bufl6;缓冲区st
6、nict结构(unsigned char Mac;类型unsigned char Len;长度unsigned char Addr;地址unsigned char Data13;数据Msg;);define uint unsigned int;自定义数据类型2.5 管脚定义说明:定义本程序使用的管脚。说明: 有特定意义的常数必须进行宏定义: 同一特定意义的常数如在多个地方应用,必须进行宏定义; 调试维护需要调整的常数必须进行宏定义: 无特定意义的循环上、下限,不需进行宏定义。2.7 变量说明:定义程序所使用的变量。 有关联的、相同地址空间、初始化、不需初始化的变量要放在一起;2.8 正文2.8
7、.1 正文顺序推荐说明: 应按主程序和中断程序的共用子程序、各中断相关子程序和中断程序、主程序相 关子程序和主程序: 关系紧密的子程序应放在一起,并按照从低到高的层次放。尽量取消函数的声明, 可通过注释说明; 除主程序和中断程序外,在不影响可读性的情况下不应设置只一个地方调用的函 数。2.8.2 正文内容说明:包含初始化程序、主循环体程序和中断程序。2.8.2.1 初始化程序推荐说明:应按管脚初始化、RAM初始化、内部设置初始化、外设初始化、打开定时器、打开 中断的顺序进行初始化。28.2.2主循环程序和中断程序推荐说明: 定时应采用计时器处理,不能存在长时间的停滞等待: 不允许多个事件使用一
8、个软件计时器。计时器宜采用倒计时: 中断事件的响应如果在主循环能够完成响应,应放在主循环。2.9 长的常量数组说明:在此定义长的常量数组,如字库、图案等。3命名命名的风格必须保持一致。3.1 常量、编译宏命名说明:常量、编译宏全部大写,单词间使用下划线分隔。示例:define MAIN_DELAY_NUM 13.2 变量命名说明:通常,在变量中加入前缀以增进人们对程序的理解。其前缀的通用格式为:数据类 型缩写+模块名+。同时,为了区分全局和局部变量,也兼顾命名的方便,特采用如下变量命名 规则: 全局变量大小写结合,数据类型缩写后,单词首字母大写: 局部变量全部小写,数据类型缩写后,使用下划线分
9、隔各单词:局部变量在不影 响可读性的前提下,可以不写数据类型: unsigned char类型的缩写不写: 汇编中,与MPU数据总线(如8位、16位)一致数据类型的缩写不写。数据类型缩写:booleanbcharclong1floatfdoubledintiunsigned intui指针p结构S输入管脚bi输出管脚 bo示例:管脚定义sbit biFire = PlAl;sbit boFireRelay = PlA2;全局变量定义bit bFault;unsigned char FireAckNum;unsigned char DeviceStatus242;unsigned char* p
10、Device;char cSampleX alue;long ITune;long* plEntry;float fRadius;double dArea;mt iFireRelayDelay;unsigned int uiFaultRelayDelay;unsigned int uiSounderDelay4;void GetSampleVhlue(void)(unsigned char temp;bit b_fault;long l_fire_delay;)3-3函数命名说明:函数命名应当直观且可以拼读,可望文知意,不必进行“解码”。标识符采用英文 单词或其组合,便于记忆和阅读,并旦每个单
11、词的首字母大写,长单词可以缩写,但缩写要使 用大家基本认可的,并旦必要是进行注释说明。下单词的缩写能够被大家基本认可:temp可缩写为tmp;flag可缩写为flg ;statistic 可缩写为 stat;increment 可缩写为 inc;message可缩写为 msg;4程序的版式4.1缩进:统一使用编辑器的TAB键进行缩进,同时设定其缩进量为系统默认说明:程序要采用统一缩进风格编写。在下列情况下,必须采用缩进:函数或过程、类的 定义、结构的定义、枚举的定义、判断和循环语句中的程序都要采用如上的缩进方式。但如果 同一程序块的缩进级数太多(一般不超过5级),可考虑使用函数减少缩进级数。示
12、例:/风格良好的格式void Function(float x, float y, float z)(if () while (.)( / end of while / end of if/风格很差的格式void Function(float x, float y, float z)9if()while (.)( / end of while / end of if4.2 空行:相对独立的程序块之间、变量说明之后必须加空行说明:空行起着分隔程序段落的作用。空行得体(不过多也不过少)将使程序的布局更加 清晰。空行不会浪费内存,虽然打印含有空行的程序是会多消耗一些纸张,但是值得。所以不 要舍不得用
13、空行。示例:如下例子不符合规范。if (!IsVaUdNI (ni)(./ program coderepssnlnd = ssnDataindex.repssnIndex;repssnNI = ssnDatuindexJ.NI;应如下书写if(!IsValidNI (ni)(./ program coderepssnlnd = ssnDataindex.repssnIndex;repssnNI = ssnDatuindexJ.NI;#4.3 代码行4.3.1 一行代码只做件事情23说明:如只定义一个变量,或只写一条语句。这样的代码容易阅读,并旦方便于写注释。 示例:(a)为风格良好的代码行i
14、nt width; / 宽度int height; / 高度int depth; / 深度x = a + b;y = c + d;z = e + f;(b)为风格不良的代码行。int width, height, depth; / 宽度高度深度X = a + b; y = c + d; z = e + f;4.3.2 if、for、while> do 等语句自占一行说明:执行语句不得紧跟其后。不论执行语句有多少都要加b这样可以防止书写失误 示例:(a)为风格良好的代码行if (width < height)(DoSomeThingO;)for (initialization; co
15、ndition; update)DoSomeThing ();(b)为风格不良的代码行。if (width < height) DoSomeThing ();Other();for (initialization; condition; update)DoSomeThing ();Other();4.3.3 程序块的分界符独占一行说明:程序块的分界符(如C/C+语言的大括号''和'')应各独占一行并且位于同 一列,同时与引用它们的语句左对齐。示例:如下例子不符合规范。for (.) .II program code)If ()./ program code
16、void ExampleFun( void )./ program code应如下书写。for (.)(./ program code)./ program codevoid ExampleFun ( void ).I I program code )4.3.4 多运算符的代码行,不使用默认优先级说明:注意运算符的优先级,并用括号明确表达式的操作顺序,防止阅读程序时产生误解, 防止因默认的优先级与设计思想不符而导致程序出错 示例:下列语句中的表达式word = (high « 8) I low (1)if (a lb) && (a&c)(2)if (a I b
17、) < (c & d)(3)如果书写为high « 8 I low alb&&a&c alb<c&d 由于high « 8 I low = ( high « 8) I low, a I b && a & c = (a I b) && (a & c), (1)(2)不会出错,但语句不易理解; alb<c&d = al (b<c) & d,造成了判断条件出错。4.3.5 不要使用难懂的技巧性很高的语句说明:高技巧语句不等于高效率的程序,实际上
18、程序的效率关键在于算法。示例:如下表达式,考虑不周就可能出问题,也较难理解。* statPoi + += 1;+ statPoi += 1;应分别改为如下。*statPoi += 1;statPoi+; / 此二语句功能相当于“字 statPoi+=1; ”+ statPoi;字statPoi += 1; /此二语句功能相当于“字+ statPoi+=1;4.4空格4.4.1 必要时留空格,使代码更清晰推荐说明:采用这种松散方式编写代码的目的是使代码更加清晰。如果语句已足够清晰则不需 要加空格,如多重括号间不必加空格,像const、virtual, inlinecase等关键字之后,为了突 出
19、关键字,至少要留一个空格。像if、for. while等关键字之后应留一个空格再跟左括号'(', 以突出关键字。“”、“%”、 “&&”、 “II”4.4.2 二元操作符前后留空格说明:如 “="、"+=” ”>="、 “<="、 ”+等二元操作符的前后应当加空格。4.4.3 一元操作符前后不留空格说明:一元操作符如“!”、“+”、“”、(地址运算符)等前后不加空 格。“口”、这类操作符前后不加空格。示例:(1)逗号、分号只在后面加空格。int a, b, c; 良好的风格int a,b,c; 不好的风格(2)
20、比较操作符,赋值操作符"="、"+=”,算术操作符"+"、“”,逻辑操作符"&&“、"&”,位域操作符“<<“、"3等双目操作符的前后加空格。if (currentTime >= MAX_TIME_VALUE)a = b + c;a'= 2;a = b A 2;(3)"!”、(地址运算符)等单目操作符前后不加空格。%/内容操作”“与内容之间flag = JisEmpty; /非操作”,与内容之间p = &mem;/地址操作"&”与
21、内容之间+;/与内容之间(4)“"、前后不加空格。p->id = pid;/ “分“指针前后不加空格(5) if、for、while、switch等与后面的括号间应加空格,使if等关键字更为突出、明显。 if (a >= b && c > d)4.5长行拆分451较长的语句(>80字符)要分成多行书写说明:较长的语句(>80字符)要分成多行书写,长表达式要在低优先级操作符处划分新 行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读。示例:permCountMsg.head.len = NO7_TO_STAT_PER
22、M_COUNT.LEN+ STAT_SIZE_PER_FRAM 孝 slzeof( _UL );actTaskTable(frameId 字 STAT_TASK_CHECKNUMBER + indexj.occupied =statPoiindex.occupied;actTaskTabletaskNoedurationTrueOrBalse=sysGetSccpStatisticState( statitem);reportOrNotFIag = (taskNo < MAX_ACT_TASK_NUMBER)&& (IsStatltemValid (statltem)&a
23、mp;& (actTaskTabletaskNo.ResultData != 0);4.5.2循环、判断等语句要在低优先级操作符处划分新行说明:循环、判断等语句中若有较长的表达式或语句,则要进行适应的划分,长表达式要 在低优先级操作符处划分新行,操作符放在新行之首。示例:if (taskNo < maxActTaskNumber)&& (IsStatltemValid (statltem)(./ program code)for (i = 0J = 0; (i < BufferKeywordwordIndexJ. Word Length)&&
24、 (J < NewKeyword. VVordLength); 1+, J+) (./ program code)453函数或过程中的参数较长,则要进行适当的划分说明:若函数或过程中的参数较长,则要进行适当的划分。示例:StrConipare( (BYTE 字)& statObject,(BYTE 字)& (actTaskTabletaskNo.statObjecth sizeof (_STAT_OBJECT);FlashActDuration( statltem, frameld STAT_TASK_CHECK_NUMBER + index, statObject);5
25、全局变量定义时初始化变量定义的同时初始化,未初始化的变量需注释其原因。6注释6.1 必须加注释的位置推荐说明:注释符有块注释”行注释和应使用进行注释,使用 /*”进行代码屏蔽。注释通常用于: 用户程序文件开头的说明; 编译宏定义、结构和联合定义、管脚定义、常量、重要变量: 重要的代码行或段落提示; 函数接口说明。6.2 注释应适量且准确推荐说明:虽然注释有助于理解代码,但不必要过多注释,也不可与代码体现的意思不一致。 注释是对代码的“提示”,而不是文档,应该“点到为止”。注释不仅要提示代码,还要体现 其显示意义。过多的注释,会让人眼花缭乱。如果代码本来就是清楚的,则不必加注释;否则 多此一举,
26、令人厌烦。不一致的注释,更让人费解。应从标识符命名、程序流程上下功夫,让代码本身就能说明自己,进而减少注释。示例:多余的注释1+; / i 加 L6.3 函数接口的注释格式说明:对函数接口进行正确而必要的注释,有助于该函数的使用和维护,甚至有助于在代 码级上测试该函数。示例:函数接口的注释/函数介绍:/输入参数:/输出参数:返回值:/备注:过程参数:(汇编中,过程参数也是需要注明的。)void DrawTriangle(float float y, float z)(if () while (.)/ end of while/ end of if6.4 变量的注释格式推荐说明:全局变量要有较详
27、细的注释,其注释的内容包括: 功能: 取值范围: 存取注意事项; 存取函数或过程: 其它说明:示例:变量的注释。/ active statistic task number#deflne MAX_ACT_TASK_NUMBER 1000#deflne MAX_ACT_TASK_NUMBER 1000 / active statistic task number示例:可按如下形式说明枚举/数据/联合结构。/ seep interface with seep user primitive message name enum SCCP_USER_PRIMITIVEN_UNITDATA_IND, /
28、seep notify seep user unit data comeN_NOTICE_IND, / seep notify user the No.7 network can not / transmission this messageN_UNITDATA_REQ / seep user's unit data transmission request );示例:全局变量要有较详细的注释。/ The ErrorCode when SCCP translate/Global Title failure9 as follows / 变量作用、含义。一 SUCCESS/I - GT T
29、able error/2 GT error Others - no use / 变量取值范围/ only function SCCPTranslate() in/ this modual can modify it, and other/ module can visit it through call/the function GetGTTransErrorCode() / 使用方法unsigned char g_uchGTTranErrorCode;6.5 注释与所描述内容进行同样的缩排说明:可使程序排版整齐,并方便注释的阅读与理解。示例:如下例子,排版不整齐,阅读稍感不方便void Ex
30、ampleFun( void )(/ code one commentsCodeBlock One/ code two commentsCodeBlock Two)应改为如下布局。void ExampleFun( void )/ code one commentsCodeBlock One/ code two commentsCodeBlock Two6.6 将注释与其上面的代码用空行隔开说明:使人能很清晰的看出,注释与被注释的代码。示例:如下例子,显得代码过于紧凑。/ code one commentsprogram code one/ code two commentsprogram co
31、de two应如下书写/ code one commentsprogram code one/ code two commentsprogram code two6.7 程序块结束行加注释推荐说明:当代码段较长,特别是多重嵌套时,在程序块的结束行右方加注释标记,以表明某 程序块的结束,这样做可以使代码更清晰,更便于阅读。示例:参见如下例子。if (.)(/ program codewhile (index < MAXJNDEX)/ program code / end of while (index < MAXJNDEX)指明该条while语句结束 / end of if ()指明是哪条if语句结束7 EEPROM【据保护说明:EEPROM数据保护的重点在于写保护。 建议不要进行直接对EEPROM的数据初始化,如发现有错,可以对其在RAM中 的映射赋默认值。这样可以防止偶然的误读而改写EEPROM中的数据源: 除了 EEPROM自带的保护外,应增加口令校验作为软件写保护。口令应让其与外 部输入相关联,避免本身意外而误修改; 保护需在初始化、运行时打开,运行时应将EEPROM的地址指针指向无用位置。8程序失效复位处理推荐说明: 喂狗的位置要尽量少,使程序失效时容易产生看门狗复位: 主函数停
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 变频器无级调速课程设计
- 常州小学个性化课程设计
- 车窗雨刮器课程设计
- 内分泌干扰物监测技师考试试卷及答案
- 母婴营养师岗位招聘考试试卷及答案
- Agent自动化测试框架机器学习课程设计
- 美容店客户服务专员岗位招聘考试试卷及答案
- 2026年中秋节假期幼儿园月饼从哪里来
- 2026年幼儿园教职工师德师风建设专题课件
- 居家卫生间地漏除臭防虫彻底处理技巧
- 四年级下册数学单位换算题200道及答案
- 物业管理服务领域:保利物业企业组织架构及部门职责
- 茶文化与茶艺(高职)全套教学课件
- 《冷库技术》课程标准
- 软组织内残留异物的护理课件
- 官能团转变反应全图解
- 《图形创意》教案
- 装修公司电话营销话术培训
- 教案伦理学原理课件
- 中医全息医学诊断头诊课件
- 内功四经内功真经真本全书
评论
0/150
提交评论