⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 编程规范与范例(5).htm

📁 编程规范与范例。从网上收集的
💻 HTM
📖 第 1 页 / 共 2 页
字号:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(4)规范/可读性,指程序书写风格、命名规则等要符合规范。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(5)全局效率,指软件系统的整体效率。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(6)局部效率,指某个模块/子模块/函数的本身效率。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(7)个人表达方式/个人方便性,指个人编程习惯。<br>&amp;sup1;	9-3:只引用属于自己的存贮空间。<br>说明:若模块封装的较好,那么一般不会发生非法引用他人的空间。<br>&amp;sup1;	9-4:防止引用已经释放的内存空间。<br>说明:在实际编程过程中,稍不留心就会出现在一个模块中释放了某个内存块(如C语言指针),而另一模块在随后的某个时刻又使用了它。要防止这种情况发生。<br>&amp;sup1;	9-5:过程/函数中分配的内存,在过程/函数退出之前要释放。<br>&amp;sup1;	9-6:过程/函数中申请的(为打开文件而使用的)文件句柄,在过程/函数退出之前要关闭。<br>说明:分配的内存不释放以及文件句柄不关闭,是较常见的错误,而且稍不注意就有可能发生。这类错误往往会引起很严重后果,且难以定位。<br>示例:下函数在退出之前,没有把分配的内存释放。<br>typedef&nbsp;unsigned&nbsp;char&nbsp;BYTE;<br><br>int&nbsp;example_fun(&nbsp;BYTE&nbsp;gt_len,&nbsp;BYTE&nbsp;*gt_code&nbsp;)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;BYTE&nbsp;*gt_buf;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;gt_buf&nbsp;=&nbsp;(BYTE&nbsp;*)&nbsp;malloc&nbsp;(MAX_GT_LENGTH);<br>&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;&nbsp;//program&nbsp;code,&nbsp;include&nbsp;check&nbsp;gt_buf&nbsp;if&nbsp;or&nbsp;not&nbsp;NULL.<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;global&nbsp;title&nbsp;length&nbsp;error&nbsp;*/<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(gt_len&nbsp;&gt;&nbsp;MAX_GT_LENGTH)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;GT_LENGTH_ERROR;&nbsp;//&nbsp;忘了释放gt_buf<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;&nbsp;//&nbsp;other&nbsp;program&nbsp;code<br>}<br><br>应改为如下。<br>int&nbsp;example_fun(&nbsp;BYTE&nbsp;gt_len,&nbsp;BYTE&nbsp;*gt_code&nbsp;)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;BYTE&nbsp;*gt_buf;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;gt_buf&nbsp;=&nbsp;(BYTE&nbsp;*&nbsp;)&nbsp;malloc&nbsp;(&nbsp;MAX_GT_LENGTH&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;&nbsp;//&nbsp;program&nbsp;code,&nbsp;include&nbsp;check&nbsp;gt_buf&nbsp;if&nbsp;or&nbsp;not&nbsp;NULL.<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;global&nbsp;title&nbsp;length&nbsp;error&nbsp;*/<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(gt_len&nbsp;&gt;&nbsp;MAX_GT_LENGTH)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;free(&nbsp;gt_buf&nbsp;&nbsp;);&nbsp;//&nbsp;退出之前释放gt_buf<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;GT_LENGTH_ERROR;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;&nbsp;//&nbsp;other&nbsp;program&nbsp;code<br>}<br>&amp;sup1;	9-7:防止内存操作越界。<br>说明:内存操作主要是指对数组、指针、内存地址等的操作。内存操作越界是软件系统主要错误之一,后果往往非常严重,所以当我们进行这些操作时一定要仔细小心。<br>示例:假设某软件系统最多可由10个用户同时使用,用户号为1-10,那么如下程序存在问题。<br>#define&nbsp;MAX_USR_NUM&nbsp;10<br>unsigned&nbsp;char&nbsp;usr_login_flg[MAX_USR_NUM]=&nbsp;&quot;&quot;;<br><br>void&nbsp;set_usr_login_flg(&nbsp;unsigned&nbsp;char&nbsp;usr_no&nbsp;)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!usr_login_flg[usr_no])<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;usr_login_flg[usr_no]=&nbsp;TRUE;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br><br>当usr_no为10时,将使用usr_login_flg越界。可采用如下方式解决。<br>void&nbsp;set_usr_login_flg(&nbsp;unsigned&nbsp;char&nbsp;usr_no&nbsp;)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!usr_login_flg[usr_no&nbsp;-&nbsp;1])<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;usr_login_flg[usr_no&nbsp;-&nbsp;1]=&nbsp;TRUE;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br>&amp;sup1;	9-8:认真处理程序所能遇到的各种出错情况。<br>&amp;sup1;	9-9:系统运行之初,要初始化有关变量及运行环境,防止未经初始化的变量被引用。<br>&amp;sup1;	9-10:系统运行之初,要对加载到系统中的数据进行一致性检查。<br>说明:使用不一致的数据,容易使系统进入混乱状态和不可知状态。<br>&amp;sup1;	9-11:严禁随意更改其它模块或系统的有关设置和配置。<br>说明:编程时,不能随心所欲地更改不属于自己模块的有关设置如常量、数组的大小等。<br>&amp;sup1;	9-12:不能随意改变与其它模块的接口。<br>&amp;sup1;	9-13:充分了解系统的接口之后,再使用系统提供的功能。<br>示例:在B型机的各模块与操作系统的接口函数中,有一个要由各模块负责编写的初始化过程,此过程在软件系统加载完成后,由操作系统发送的初始化消息来调度。因此就涉及到初始化消息的类型与消息发送的顺序问题,特别是消息顺序,若没搞清楚就开始编程,很容易引起严重后果。以下示例引自B型曾出现过的实际代码,其中使用了FID_FETCH_DATA与FID_INITIAL初始化消息类型,注意B型机的系统是在FID_FETCH_DATA之前发送FID_INITIAL的。<br><br>MID&nbsp;alarm_module_list[MAX_ALARM_MID];<br><br>int&nbsp;FAR&nbsp;SYS_ALARM_proc(&nbsp;FID&nbsp;function_id,&nbsp;int&nbsp;handle&nbsp;)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;_UI&nbsp;i,&nbsp;j;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;switch&nbsp;(&nbsp;function_id&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;//&nbsp;program&nbsp;code<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;FID_INITAIL:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;MAX_ALARM_MID;&nbsp;i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(alarm_module_list[i]==&nbsp;BAM_MODULE&nbsp;//&nbsp;**)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;||&nbsp;(alarm_module_list[i]==&nbsp;LOCAL_MODULE)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(j&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt;&nbsp;ALARM_CLASS_SUM;&nbsp;j++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FAR_MALLOC(&nbsp;...&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;//&nbsp;program&nbsp;code<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;FID_FETCH_DATA:<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;//&nbsp;program&nbsp;code<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Get_Alarm_Module(&nbsp;);&nbsp;&nbsp;//&nbsp;初始化alarm_module_list<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;//&nbsp;program&nbsp;code<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br><br>由于FID_INITIAL是在FID_FETCH_DATA之前执行的,而初始化alarm_module_list是在FID_FETCH_DATA中进行的,故在FID_INITIAL中(**)处引用alarm_module_list变量时,它还没有被初始化。这是个严重错误。<br>应如下改正:要么把Get_Alarm_Module函数放在FID_INITIAL中(**)之前;要么就必须考虑(**)处的判断语句是否可以用(不使用alarm_module_list变量的)其它方式替代,或者是否可以取消此判断语句。<br>&amp;sup1;	9-14:编程时,要防止差1错误。<br>说明:此类错误一般是由于把“&lt;=”误写成“&lt;”或“&gt;=”误写成“&gt;”等造成的,由此引起的后果,很多情况下是很严重的,所以编程时,一定要在这些地方小心。当编完程序后,应对这些操作符进行彻底检查。<br>&amp;sup1;	9-15:要时刻注意易混淆的操作符。当编完程序后,应从头至尾检查一遍这些操作符,以防止拼写错误。<br>说明:形式相近的操作符最容易引起误用,如C/C++中的“=”与“==”、“|”与“||”、“&amp;”与“&amp;&amp;”等,若拼写错了,编译器不一定能够检查出来。<br>示例:如把“&amp;”写成“&amp;&amp;”,或反之。<br>ret_flg&nbsp;=&nbsp;(pmsg-&gt;ret_flg&nbsp;&amp;&nbsp;RETURN_MASK);&nbsp;&nbsp;<br>被写为:<br>ret_flg&nbsp;=&nbsp;(pmsg-&gt;ret_flg&nbsp;&amp;&amp;&nbsp;RETURN_MASK);<br><br>rpt_flg&nbsp;=&nbsp;(VALID_TASK_NO(&nbsp;taskno&nbsp;)&nbsp;&amp;&amp;&nbsp;DATA_NOT_ZERO(&nbsp;stat_data&nbsp;));<br>被写为:<br>rpt_flg&nbsp;=&nbsp;(VALID_TASK_NO(&nbsp;taskno&nbsp;)&nbsp;&amp;&nbsp;DATA_NOT_ZERO(&nbsp;stat_data&nbsp;));<br>&amp;sup1;	9-16:有可能的话,if语句尽量加上else分支,对没有else分支的语句要小心对待;switch语句必须有default分支。<br>&amp;sup1;	9-17:Unix下,多线程的中的子线程退出必需采用主动退出方式,即子线程应return出口。<br>&amp;sup1;	9-18:不要滥用goto语句。<br>说明:goto语句会破坏程序的结构性,所以除非确实需要,最好不使用goto语句。<br>&amp;frac12;	9-1:不使用与硬件或操作系统关系很大的语句,而使用建议的标准语句,以提高软件的可移植性和可重用性。<br>&amp;frac12;	9-2:除非为了满足特殊需求,避免使用嵌入式汇编。<br>说明:程序中嵌入式汇编,一般都对可移植性有较大的影响。<br>&amp;frac12;	9-3:精心地构造、划分子模块,并按“接口”部分及“内核”部分合理地组织子模块,以提高“内核”部分的可移植性和可重用性。<br>说明:对不同产品中的某个功能相同的模块,若能做到其内核部分完全或基本一致,那么无论对产品的测试、维护,还是对以后产品的升级都会有很大帮助。<br>&amp;frac12;	9-4:精心构造算法,并对其性能、效率进行测试。<br>&amp;frac12;	9-5:对较关键的算法最好使用其它算法来确认。<br>&amp;frac12;	9-6:时刻注意表达式是否会上溢、下溢。<br>示例:如下程序将造成变量下溢。<br>unsigned&nbsp;char&nbsp;size&nbsp;;<br>while&nbsp;(size--&nbsp;&gt;=&nbsp;0)&nbsp;//&nbsp;将出现下溢<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;//&nbsp;program&nbsp;code<br>}<br><br>当size等于0时,再减1不会小于0,而是0xFF,故程序是一个死循环。应如下修改。<br>char&nbsp;size;&nbsp;//&nbsp;从unsigned&nbsp;char&nbsp;改为char<br>while&nbsp;(size--&nbsp;&gt;=&nbsp;0)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;//&nbsp;program&nbsp;code<br>}<br>&amp;frac12;	9-7:使用变量时要注意其边界值的情况。<br>示例:如C语言中字符型变量,有效值范围为-128到127。故以下表达式的计算存在一定风险。<br>char&nbsp;chr&nbsp;=&nbsp;127;<br>int&nbsp;sum&nbsp;=&nbsp;200;<br><br>chr&nbsp;+=&nbsp;1;&nbsp;//&nbsp;127为chr的边界值,再加1将使chr上溢到-128,而不是128。<br>sum&nbsp;+=&nbsp;chr;&nbsp;//&nbsp;故sum的结果不是328,而是72。<br><br>若chr与sum为同一种类型,或表达式按如下方式书写,可能会好些。<br>sum&nbsp;=&nbsp;sum&nbsp;+&nbsp;chr&nbsp;+&nbsp;1;&nbsp;<br>&amp;frac12;	9-8:留心程序机器码大小(如指令空间大小、数据空间大小、堆栈空间大小等)是否超出系统有关限制。<br>&amp;frac12;	9-9:为用户提供良好的接口界面,使用户能较充分地了解系统内部运行状态及有关系统出错情况。<br>&amp;frac12;	9-10:系统应具有一定的容错能力,对一些错误事件(如用户误操作等)能进行自动补救。<br>&amp;frac12;	9-11:对一些具有危险性的操作代码(如写硬盘、删数据等)要仔细考虑,防止对数据、硬件等的安全构成危害,以提高系统的安全性。<br>&amp;frac12;	9-12:使用第三方提供的软件开发工具包或控件时,要注意以下几点:<br>(1)充分了解应用接口、使用环境及使用时注意事项。<br>(2)不能过分相信其正确性。<br>(3)除非必要,不要使用不熟悉的第三方工具包与控件。<br>说明:使用工具包与控件,可加快程序开发速度,节省时间,但使用之前一定对它有较充分的了解,同时第三方工具包与控件也有可能存在问题。<br>&amp;frac12;	9-13:资源文件(多语言版本支持),如果资源是对语言敏感的,应让该资源与源代码文件脱离,具体方法有下面几种:使用单独的资源文件、DLL文件或其它单独的描述文件(如数据库格式)</td> 
          </tr>
          <tr>
            <td width="600"></td> 
          </tr>
		  <tr>
            <td width="600"><b>郑重声明</b><br>
              &nbsp;&nbsp; 近年来我站数百篇“原创文章”被一些媒体肆意转载,不但不标明出自“中国电子技术信息网”,而且把相关字眼删除!这是无视技术价值的盗窃行为,是对技术人员辛勤劳动的蔑视,我对此种行为表示强烈的谴责。<br>
              &nbsp;&nbsp; “本是同根生,相煎何太急”,考虑到我们做技术的都是同门兄弟,对以前的盗窃行为不再追究,今后再有此类事件,最低处理限度是“明示于天下”。在这里向转载过又标注了出处的兄弟媒体表示崇高的敬意!<br>
              &nbsp;&nbsp; 兄弟网站如果引用本站“原创文章”,请首先经本人许可,并标注“www.cetinet.com”或“中国电子技术信息网”字样。<br>
              &nbsp;&nbsp; 欢迎个人下载使用!</td> 
          </tr>
        </table>
      </td>
    </tr>
  </table>
  <br>
  <br>
</div>

</body>
<body bgcolor="#FFFFFF" text="#000000">
  <p align="center">
  本站所载文章力求原创,部分资料转自网上,假如您认为某些文章侵犯了您的权益,<br>
  请告知我们,我们将在最短的时间内删除有关文章。本站转载文章均注明出处。<br>
  兄弟网站如果转载本站文章请注明本站版权,谢谢!
  <p align="center">中国电子技术信息网 文章管理系统由:Aoe 制作<br>      
  Copyright (C) 2001-2004 CETINet.COM All Rights Reserved      
</body>    

</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -