📄 编程规范与范例(2).htm
字号:
<TD><STRONG><FONT color=#ff0000>博客信息</FONT></STRONG></TD></TR>
<TR bgColor=#ffffff>
<TD>
<P><FONT color=#ff0000>blog名称:匠人的百宝箱<br>日志总数:1837<br>评论数量:707<br>留言数量:24<br>访问次数:1352231<br>建立时间:2005年5月18日</FONT></P>
<P align=center><FONT size=3><A href="http://cxjr.21ic.org/" target=_blank><IMG style="BORDER-LEFT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-COLOR: #000000; BORDER-RIGHT-COLOR: #000000" src="http://blog.21ic.org/uploadfile-/20051217161245384.gif" border=0></A></FONT></P></TD></TR></TBODY></TABLE></P>
<TD vAlign=top align=middle width=660>
<P align=left>
<TABLE style="TABLE-LAYOUT: fixed; WORD-BREAK: break-all" cellSpacing=1 cellPadding=3 width="100%" bgColor=#cccccc border=0>
<TBODY>
<TR bgColor=#f8f8f8>
<TD><STRONG><FONT color=#ff0000>广告(2号位)</FONT></STRONG></TD></TR>
<TR bgColor=#ffffff>
<TD>
<DIV align=center>
<ADDRESS> <A href="http://www.3gmcu.com/" target=_blank><IMG style="BORDER-LEFT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-COLOR: #000000; BORDER-RIGHT-COLOR: #000000" src="http://blog.21ic.org/uploadfile-/2005122820932375.gif" border=0></A></ADDRESS></DIV></TD></TR></TBODY></TABLE></P>
<P align=left>
<TABLE style="TABLE-LAYOUT: fixed; WORD-BREAK: break-all" cellSpacing=1 cellPadding=3 width="100%" bgColor=#cccccc border=0>
<TBODY>
<TR bgColor=#f8f8f8>
<TD><STRONG><FONT color=#ff0000>酷贴推荐 <FONT color=#ff0000>[</FONT><A href="http://blog.21ic.org/more.asp?name=cxjr&id=7437" target=_blank><U><FONT color=#ff0000>更多…… </FONT></U></A><FONT color=#ff0000>]</FONT></FONT></STRONG></TD></TR>
<TR bgColor=#ffffff>
<TD>
<P align=left>
<TABLE borderColor=#cccccc cellSpacing=2 cellPadding=3 width="100%" bgColor=#ffffff border=1>
<TBODY>
<TR>
<TD>
<P align=center> [<A href="http://blog.21ic.com/more.asp?name=cxjr&id=16591"><U><FONT style="BACKGROUND-COLOR: #ffff00" color=#ff0000>岁月如歌——记匠人的百宝箱博客开通一周年</FONT></U></A>] [<A href="http://blog.21ic.com/more.asp?name=cxjr&id=17379"><U><FONT color=#0000ff>事件驅動觀念</FONT></U></A>] [<A href="http://blog.21ic.com/more.asp?name=cxjr&id=17377"><U><FONT color=#0000ff>单片机程序设计中运用事件驱动机制</FONT></U></A>]</P></TD>
<TR>
<TD>
<P align=center>[<A href="http://blog.21ic.com/more.asp?name=cxjr&id=18941"><U><FONT color=#0000ff>计算机族必喝的健康饮料</FONT></U></A>] [<A href="http://blog.21ic.com/more.asp?name=cxjr&id=18714"><U><FONT color=#0000ff>男人·女人·电脑</FONT></U></A>] [<A href="http://blog.21ic.com/more.asp?name=cxjr&id=18713"><U><FONT color=#0000ff>学编程的人不能不看的好文章</FONT></U></A>] [<A href="http://blog.21ic.com/more.asp?name=cxjr&id=18742"><U><FONT color=#0000ff>PIC机与MCS-51的区别</FONT></U></A>]</P></TD>
<TR>
<TD>
<P align=center>[<A href="http://blog.21ic.com/more.asp?name=cxjr&id=19794"><U><FONT color=#0000ff>一种软件去除键抖动的方法</FONT></U></A>] [<A href="http://blog.21ic.com/more.asp?name=cxjr&id=19752"><U><FONT color=#0000ff>司马光,你干嘛砸缸?</FONT></U></A>] [<A href="http://blog.21ic.com/more.asp?name=cxjr&id=19748"><U><FONT color=#0000ff>编码规范</FONT></U></A>] </P></TD>
<TR>
<TD>
<P align=center><FONT color=#ff0000>调查:[</FONT><A href="http://21icbbs.com/club/vote/showvote.asp?id=98" target=_blank><U><FONT color=#ff0000>您认为《匠人的百宝箱》如何?</FONT></U></A><FONT color=#ff0000>] [</FONT><A href="http://21icbbs.com/club/vote/showvote.asp?id=129" target=_blank><U><FONT color=#ff0000>您最喜欢《匠人的百宝箱》中哪个栏目?</FONT></U></A><FONT color=#ff0000>] [</FONT><A href="http://blog.21ic.com/more.asp?name=cxjr&id=18993"><U><FONT color=#ff0000>请网友来评选最佳队员专栏</FONT></U></A><FONT color=#ff0000>]</FONT> </P></TD></TR></TBODY></TABLE></P></TD></TR></TBODY></TABLE></P>
<P align=left>
<TABLE style="TABLE-LAYOUT: fixed; WORD-BREAK: break-all" cellSpacing=1 cellPadding=3 width="100%" bgColor=#cccccc border=0>
<TBODY>
<TR bgColor=#f8f8f8>
<TD>
<P align=left><FONT color=#ff0000 size=4><STRONG><img src=images/face/1.gif ><a href=blog.asp?name=cxjr&subjectid=66>[编程技巧]<a href=more.asp?name=cxjr&id=2755>编程规范与范例(2)</a></STRONG></FONT><BR>程序匠人 2005-8-27 20:15:00 <a href=more.asp?name=cxjr&id=2755>阅读全文(801)</a> | <a href=more.asp?name=cxjr&id=2755#comment>回复(0)</a> | <a href=showtb.asp?id=2755 target=_blank>引用(0)</a><BR><FONT face=宋体 size=4><STRONG>[</STRONG></FONT><A href="http://blog.21ic.org/more.asp?name=cxjr&id=6250" target=_blank><FONT face=宋体 color=#ff0000 size=4><STRONG>广告8号位</STRONG></FONT></A><FONT face=宋体 size=4><STRONG>] [</STRONG></FONT><A href="http://blog.21ic.org/more.asp?name=cxjr&id=7705"><U><FONT style="BACKGROUND-COLOR: #000000" face=宋体 color=#ffffff size=4><STRONG>免责声明</STRONG></FONT></U></A><FONT face=宋体 size=4><STRONG>] [</STRONG><A href="http://blog.21ic.com/more.asp?name=cxjr&id=18993"><U><FONT style="BACKGROUND-COLOR: #ffff00" color=#ff0000 size=3><STRONG>请网友来评选最佳队员专栏!</STRONG></FONT></U></A><STRONG>]</STRONG></FONT></P></TD></TR>
<TR bgColor=#ffffff>
<TD height=0>
<DIV align=left><P>编程规范与范例(2) <BR>〖文章转载或出处〗≡中国电子技术信息网≡ 网址:<A href="http://www.CETINet.com">www.CETINet.com</A> <BR>编程规范与范例(2)</P>
<P>目 录<BR>1 排版 6<BR>2 注释 11<BR>3 标识符命名 18<BR>4 可读性 20<BR>5 变量、结构 22<BR>6 函数、过程 28<BR>7 可测性 36<BR>8 程序效率 40<BR>9 质量保证 44<BR>10 代码编辑、编译、审查 50<BR>11 代码测试、维护 52<BR>12 宏 53</P>
<P>3 标识符命名<BR>&sup1; 3-1:标识符的命名要清晰、明了,有明确含义,同时使用完整的单词或大家基本可以理解的缩写,避免使人产生误解。<BR>说明:较短的单词可通过去掉“元音”形成缩写;较长的单词可取单词的头几个字母形成缩写;一些单词有大家公认的缩写。<BR>示例:如下单词的缩写能够被大家基本认可。<BR>temp 可缩写为 tmp ;<BR>flag 可缩写为 flg ;<BR>statistic 可缩写为 stat ;<BR>increment 可缩写为 inc ;<BR>message 可缩写为 msg ;<BR>&sup1; 3-2:命名中若使用特殊约定或缩写,则要有注释说明。<BR>说明:应该在源文件的开始之处,对文件中所使用的缩写或约定,特别是特殊的缩写,进行必要的注释说明。<BR>&sup1; 3-3:自己特有的命名风格,要自始至终保持一致,不可来回变化。<BR>说明:个人的命名风格,在符合所在项目组或产品组的命名规则的前提下,才可使用。(即命名规则中没有规定到的地方才可有个人命名风格)。<BR>&sup1; 3-4:对于变量命名,禁止取单个字符(如i、j、k...),建议除了要有具体含义外,还能表明其变量类型、数据类型等,但i、j、k作局部循环变量是允许的。<BR>说明:变量,尤其是局部变量,如果用单个字符表示,很容易敲错(如i写成j),而编译时又检查不出来,有可能为了这个小小的错误而花费大量的查错时间。<BR>示例:下面所示的局部变量名的定义方法可以借鉴。<BR>int liv_Width<BR>其变量名解释如下:<BR>l 局部变量(Local) (其它:g 全局变量(Global)...)<BR>i 数据类型(Interger)<BR>v 变量(Variable) (其它:c 常量(Const)...)<BR>Width 变量含义<BR>这样可以防止局部变量与全局变量重名。<BR>&sup1; 3-5:命名规范必须与所使用的系统风格保持一致,并在同一项目中统一,比如采用UNIX的全小写加下划线的风格或大小写混排的方式,不要使用大小写与下划线混排的方式,用作特殊标识如标识成员变量或全局变量的m_和g_,其后加上大小写混排的方式是允许的。<BR>示例: Add_User不允许,add_user、AddUser、m_AddUser允许。 <BR>&frac12; 3-1:除非必要,不要用数字或较奇怪的字符来定义标识符。<BR>示例:如下命名,使人产生疑惑。<BR>#define _EXAMPLE_0_TEST_<BR>#define _EXAMPLE_1_TEST_<BR>void set_sls00( BYTE sls );</P>
<P>应改为有意义的单词命名<BR>#define _EXAMPLE_UNIT_TEST_<BR>#define _EXAMPLE_ASSERT_TEST_<BR>void set_udt_msg_sls( BYTE sls );<BR>&frac12; 3-2:在同一软件产品内,应规划好接口部分标识符(变量、结构、函数及常量)的命名,防止编译、链接时产生冲突。<BR>说明:对接口部分的标识符应该有更严格限制,防止冲突。如可规定接口部分的变量与常量之前加上“模块”标识等。<BR>&frac12; 3-3:用正确的反义词组命名具有互斥意义的变量或相反动作的函数等。<BR>说明:下面是一些在软件中常用的反义词组。<BR>add / remove begin / end create / destroy <BR>insert / delete first / last get / release<BR>increment / decrement put / get<BR>add / delete lock / unlock open / close<BR>min / max old / new start / stop<BR>next / previous source / target show / hide<BR>send / receive source / destination<BR>cut / paste up / down<BR>示例:<BR>int min_sum;<BR>int max_sum;<BR>int add_user( BYTE *user_name );<BR>int delete_user( BYTE *user_name );<BR>&frac12; 3-4:除了编译开关/头文件等特殊应用,应避免使用_EXAMPLE_TEST_之类以下划线开始和结尾的定义。<BR> <BR>4 可读性<BR>&sup1; 4-1:注意运算符的优先级,并用括号明确表达式的操作顺序,避免使用默认优先级。<BR>说明:防止阅读程序时产生误解,防止因默认的优先级与设计思想不符而导致程序出错。<BR>示例:下列语句中的表达式<BR>word = (high << 8) | low (1)<BR>if ((a | b) && (a & c)) (2)<BR>if ((a | b) < (c & d)) (3)<BR>如果书写为<BR>high << 8 | low<BR>a | b && a & c<BR>a | b < c & d<BR>由于<BR>high << 8 | low = ( high << 8) | low,<BR>a | b && a & c = (a | b) && (a & c),<BR>(1)(2)不会出错,但语句不易理解;<BR>a | b < c & d = a | (b < c) & d,(3)造成了判断条件出错。<BR>&sup1; 4-2:避免使用不易理解的数字,用有意义的标识来替代。涉及物理状态或者含有物理意义的常量,不应直接使用数字,必须用有意义的枚举或宏来代替。<BR>示例:如下的程序可读性差。<BR>if (Trunk[index].trunk_state == 0)<BR>{<BR> Trunk[index].trunk_state = 1;<BR> ... // program code<BR>}</P>
<P>应改为如下形式。<BR>#define TRUNK_IDLE 0<BR>#define TRUNK_BUSY 1</P>
<P>if (Trunk[index].trunk_state == TRUNK_IDLE)<BR>{<BR> Trunk[index].trunk_state = TRUNK_BUSY;<BR> ... // program code<BR>}<BR>&frac12; 4-1:源程序中关系较为紧密的代码应尽可能相邻。<BR>说明:便于程序阅读和查找。<BR>示例:以下代码布局不太合理。<BR>rect.length = 10;<BR>char_poi = str;<BR>rect.width = 5;</P>
<P>若按如下形式书写,可能更清晰一些。<BR>rect.length = 10;<BR>rect.width = 5; // 矩形的长与宽关系较密切,放在一起。<BR>char_poi = str;<BR>&frac12; 4-2:不要使用难懂的技巧性很高的语句,除非很有必要时。<BR>说明:高技巧语句不等于高效率的程序,实际上程序的效率关键在于算法。<BR>示例:如下表达式,考虑不周就可能出问题,也较难理解。<BR>* stat_poi ++ += 1;</P>
<P>* ++ stat_poi += 1;</P>
<P>应分别改为如下。<BR>*stat_poi += 1;<BR>stat_poi++; // 此二语句功能相当于“ * stat_poi ++ += 1; ”</P>
<P>++ stat_poi;<BR>*stat_poi += 1; // 此二语句功能相当于“ * ++ stat_poi += 1; ”<BR>5 变量、结构<BR>&sup1; 5-1:去掉没必要的公共变量。<BR>说明:公共变量是增大模块间耦合的原因之一,故应减少没必要的公共变量以降低模块间的耦合度。<BR>&sup1; 5-2:仔细定义并明确公共变量的含义、作用、取值范围及公共变量间的关系。<BR>说明:在对变量声明的同时,应对其含义、作用及取值范围进行注释说明,同时若有必要还应说明与其它变量的关系。<BR>&sup1; 5-3:明确公共变量与操作此公共变量的函数或过程的关系,如访问、修改及创建等。<BR>说明:明确过程操作变量的关系后,将有利于程序的进一步优化、单元测试、系统联调以及代码维护等。这种关系的说明可在注释或文档中描述。<BR>示例:在源文件中,可按如下注释形式说明。<BR>RELATION System_Init Input_Rec Print_Rec Stat_Score<BR>Student Create Modify Access Access<BR>Score Create Modify Access Access, Modify</P>
<P>注:RELATION为操作关系;System_Init、Input_Rec、Print_Rec、Stat_Score为四个不同的函数;Student、Score为两个全局变量;Create表示创建,Modify表示修改,Access表示访问。<BR>其中,函数Input_Rec、Stat_Score都可修改变量Score,故此变量将引起函数间较大的耦合,并可能增加代码测试、维护的难度。<BR>&sup1; 5-4:当向公共变量传递数据时,要十分小心,防止赋与不合理的值或越界等现象发生。<BR>说明:对公共变量赋值时,若有必要应进行合法性检查,以提高代码的可靠性、稳定性。<BR>&sup1; 5-5:防止局部变量与公共变量同名。<BR>说明:若使用了较好的命名规则,那么此问题可自动消除。<BR>&sup1; 5-6:严禁使用未经初始化的变量作为右值。<BR>说明:特别是在C/C++中引用未经赋值的指针,经常会引起系统崩溃。<BR>&frac12; 5-1:构造仅有一个模块或函数可以修改、创建,而其余有关模块或函数只访问的公共变量,防止多个不同模块或函数都可以修改、创建同一公共变量的现象。<BR>说明:降低公共变量耦合度。<BR>&frac12; 5-2:使用严格形式定义的、可移植的数据类型,尽量不要使用与具体硬件或软件环境关系密切的变量。<BR>说明:使用标准的数据类型,有利于程序的移植。<BR>示例:如下例子(在DOS下BC3.1环境中),在移植时可能产生问题。<BR>void main()<BR>{<BR> register int index; // 寄存器变量</P>
<P> _AX = 0x4000; // _AX是BC3.1提供的寄存器“伪变量”<BR> ... // program code<BR>}<BR>&frac12; 5-3:结构的功能要单一,是针对一种事务的抽象。<BR>说明:设计结构时应力争使结构代表一种现实事务的抽象,而不是同时代表多种。结构中的各元素应代表同一事务的不同侧面,而不应把描述没有关系或关系很弱的不同事务的元素放到同一结构中。<BR>示例:如下结构不太清晰、合理。<BR>typedef struct STUDENT_STRU<BR>{<BR> unsigned char name[8]; /* student's name */<BR> unsigned char age; /* student's age */<BR> unsigned char sex; /* student's sex, as follows */<BR> /* 0 - FEMALE; 1 - MALE */<BR> unsigned char <BR> teacher_name[8]; /* the student teacher's name */<BR> unisgned char <BR> teacher_sex; /* his teacher sex */<BR>} STUDENT;</P>
<P>若改为如下,可能更合理些。<BR>typedef struct TEACHER_STRU<BR>{<BR> unsigned char name[8]; /* teacher name */<BR> unisgned char sex; /* teacher sex, as follows */<BR> /* 0 - FEMALE; 1 - MALE */<BR>} TEACHER;</P>
<P>typedef struct STUDENT_STRU<BR>{<BR> unsigned char name[8]; /* student's name */<BR> unsigned char age; /* student's age */<BR> unsigned char sex; /* student's sex, as follows */<BR> /* 0 - FEMALE; 1 - MALE */<BR> unsigned int teacher_ind; /* his teacher index */<BR>} STUDENT;<BR>&frac12; 5-4:不要设计面面俱到、非常灵活的数据结构。<BR>说明:面面俱到、灵活的数据结构反而容易引起误解和操作困难。<BR>&frac12; 5-5:不同结构间的关系不要过于复杂。<BR>说明:若两个结构间关系较复杂、密切,那么应合为一个结构。<BR>示例:如下两个结构的构造不合理。<BR>typedef struct PERSON_ONE_STRU<BR>{<BR> unsigned char name[8];<BR> unsigned char addr[40];<BR> unsigned char sex;<BR> unsigned char city[15];<BR>} PERSON_ONE;</P>
<P>typedef struct PERSON_TWO_STRU<BR>{<BR> unsigned char name[8];<BR> unsigned char age;<BR> unsigned char tel;<BR>} PERSON_TWO;</P>
<P>由于两个结构都是描述同一事物的,那么不如合成一个结构。<BR>typedef struct PERSON_STRU<BR>{<BR> unsigned char name[8];<BR> unsigned char age;<BR> unsigned char sex;<BR> unsigned char addr[40];<BR> unsigned char city[15];<BR> unsigned char tel;<BR>} PERSON;<BR>&frac12; 5-6:结构中元素的个数应适中。若结构中元素个数过多可考虑依据某种原则把元素组成不同的子结构,以减少原结构中元素的个数。<BR>说明:增加结构的可理解性、可操作性和可维护性。<BR>示例:假如认为如上的_PERSON结构元素过多,那么可如下对之划分。<BR>typedef struct PERSON_BASE_INFO_STRU<BR>{<BR> unsigned char name[8];<BR> unsigned char age;<BR> unsigned char sex;<BR>} PERSON_BASE_INFO;</P>
<P>typedef struct PERSON_ADDRESS_STRU<BR>{<BR> unsigned char addr[40];<BR> unsigned char city[15];<BR> unsigned char tel;<BR>} PERSON_ADDRESS;</P>
<P>typedef struct PERSON_STRU<BR>{<BR> PERSON_BASE_INFO person_base;<BR> PERSON_ADDRESS person_addr;<BR>} PERSON;<BR>&frac12; 5-7:仔细设计结构中元素的布局与排列顺序,使结构容易理解、节省占用空间,并减少引起误用现象。<BR>说明:合理排列结构中元素顺序,可节省空间并增加可理解性。<BR>示例:如下结构中的位域排列,将占较大空间,可读性也稍差。<BR>typedef struct EXAMPLE_STRU<BR>{<BR> unsigned int valid: 1;<BR> PERSON person;<BR> unsigned int set_flg: 1;<BR>} EXAMPLE;</P>
<P>若改成如下形式,不仅可节省1字节空间,可读性也变好了。<BR>typedef struct EXAMPLE_STRU<BR>{<BR> unsigned int valid: 1;<BR> unsigned int set_flg: 1;<BR> PERSON person ;<BR>} EXAMPLE;<BR>&frac12; 5-8:结构的设计要尽量考虑向前兼容和以后的版本升级,并为某些未来可能的应用保留余地(如预留一些空间等)。<BR>说明:软件向前兼容的特性,是软件产品是否成功的重要标志之一。如果要想使产品具有较好的前向兼容,那么在产品设计之初就应为以后版本升级保留一定余地,并且在产品升级时必须考虑前一版本的各种特性。<BR>&frac12; 5-9:留心具体语言及编译器处理不同数据类型的原则及有关细节。<BR>说明:如在C语言中,static局部变量将在内存“数据区”中生成,而非static局部变量将在“堆栈”中生成。这些细节对程序质量的保证非常重要。<BR>&frac12; 5-10:编程时,要注意数据类型的强制转换。<BR>说明:当进行数据类型强制转换时,其数据的意义、转换后的取值等都有可能发生变化,而这些细节若考虑不周,就很有可能留下隐患。<BR>&frac12; 5-11:对编译系统默认的数据类型转换,也要有充分的认识。<BR>示例:如下赋值,多数编译器不产生告警,但值的含义还是稍有变化。<BR>char chr;<BR>unsigned short int exam;</P>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -