?? 編程規范與范例(1).htm
字號:
<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=2754>編程規范與范例(1)</a></STRONG></FONT><BR>程序匠人 2005-8-27 20:14:00 <a href=more.asp?name=cxjr&id=2754>閱讀全文(1414)</a> | <a href=more.asp?name=cxjr&id=2754#comment>回復(0)</a> | <a href=showtb.asp?id=2754 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>編程規范與范例(1) <BR>〖文章轉載或出處〗≡中國電子技術信息網≡ 網址:<A href="http://www.CETINet.com">www.CETINet.com</A> <BR>編程規范與范例(1)</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<BR> <BR>1 排版<BR>&sup1; 1-1:程序塊要采用縮進風格編寫,縮進的空格數為4個。<BR>說明:對于由開發工具自動生成的代碼可以有不一致。<BR>&sup1; 1-2:相對獨立的程序塊之間、變量說明之后必須加空行。<BR>示例:如下例子不符合規范。<BR>if (!valid_ni(ni))<BR>{<BR> ... // program code<BR>}<BR>repssn_ind = ssn_data[index].repssn_index;<BR>repssn_ni = ssn_data[index].ni;</P>
<P>應如下書寫<BR>if (!valid_ni(ni))<BR>{<BR> ... // program code<BR>}</P>
<P>repssn_ind = ssn_data[index].repssn_index;<BR>repssn_ni = ssn_data[index].ni;<BR>&sup1; 1-3:較長的語句(>80字符)要分成多行書寫,長表達式要在低優先級操作符處劃分新行,操作符放在新行之首,劃分出的新行要進行適當的縮進,使排版整齊,語句可讀。<BR>示例:<BR>perm_count_msg.head.len = NO7_TO_STAT_PERM_COUNT_LEN<BR> + STAT_SIZE_PER_FRAM * sizeof( _UL );</P>
<P>act_task_table[frame_id * STAT_TASK_CHECK_NUMBER + index].occupied<BR> = stat_poi[index].occupied;</P>
<P>act_task_table[taskno].duration_true_or_false<BR> = SYS_get_sccp_statistic_state( stat_item );</P>
<P>report_or_not_flag = ((taskno < MAX_ACT_TASK_NUMBER)<BR> && (n7stat_stat_item_valid (stat_item))<BR> && (act_task_table[taskno].result_data != 0));<BR> <BR>&sup1; 1-4:循環、判斷等語句中若有較長的表達式或語句,則要進行適應的劃分,長表達式要在低優先級操作符處劃分新行,操作符放在新行之首。<BR>示例:<BR>if ((taskno < max_act_task_number)<BR> && (n7stat_stat_item_valid (stat_item)))<BR>{<BR> ... // program code<BR>}</P>
<P>for (i = 0, j = 0; (i < BufferKeyword[word_index].word_length)<BR> && (j < NewKeyword.word_length); i++, j++)<BR>{<BR> ... // program code<BR>}</P>
<P>for (i = 0, j = 0; <BR> (i < first_word_length) && (j < second_word_length); <BR> i++, j++)<BR>{<BR> ... // program code <BR>}<BR>&sup1; 1-5:若函數或過程中的參數較長,則要進行適當的劃分。<BR>示例:<BR>n7stat_str_compare((BYTE *) & stat_object,<BR> (BYTE *) & (act_task_table[taskno].stat_object),<BR> sizeof (_STAT_OBJECT));</P>
<P>n7stat_flash_act_duration( stat_item, frame_id *STAT_TASK_CHECK_NUMBER<BR> + index, stat_object );<BR>&sup1; 1-6:不允許把多個短語句寫在一行中,即一行只寫一條語句。<BR>示例:如下例子不符合規范。<BR>rect.length = 0; rect.width = 0;</P>
<P>應如下書寫<BR>rect.length = 0;<BR>rect.width = 0;<BR>&sup1; 1-7:if、for、do、while、case、switch、default等語句自占一行,且if、for、do、while等語句的執行語句部分無論多少都要加括號{}。 <BR>示例:如下例子不符合規范。<BR>if (pUserCR == NULL) return;</P>
<P>應如下書寫:<BR>if (pUserCR == NULL)<BR>{<BR> return;<BR>}<BR>&sup1; 1-8:對齊只使用空格鍵,不使用TAB鍵。<BR>說明:以免用不同的編輯器閱讀程序時,因TAB鍵所設置的空格數目不同而造成程序布局不整齊,不要使用BC作為編輯器合版本,因為BC會自動將8個空格變為一個TAB鍵,因此使用BC合入的版本大多會將縮進變亂。<BR>&sup1; 1-9:函數或過程的開始、結構的定義及循環、判斷等語句中的代碼都要采用縮進風格,case語句下的情況處理語句也要遵從語句縮進要求。<BR>&sup1; 1-10:程序塊的分界符(如C/C++語言的大括號‘{’和‘}’)應各獨占一行并且位于同一列,同時與引用它們的語句左對齊。在函數體的開始、類的定義、結構的定義、枚舉的定義以及if、for、do、while、switch、case語句中的程序都要采用如上的縮進方式。<BR>示例:如下例子不符合規范。<BR>for (...) {<BR> ... // program code<BR>}</P>
<P>if (...) <BR> {<BR> ... // program code<BR> }</P>
<P>void example_fun( void )<BR> {<BR> ... // program code<BR> }</P>
<P>應如下書寫。<BR>for (...) <BR>{<BR> ... // program code<BR>}</P>
<P>if (...) <BR>{<BR> ... // program code<BR>}</P>
<P>void example_fun( void )<BR>{<BR> ... // program code<BR>}<BR>&sup1; 1-11:在兩個以上的關鍵字、變量、常量進行對等操作時,它們之間的操作符之前、之后或者前后要加空格;進行非對等操作時,如果是關系密切的立即操作符(如->),后不應加空格。<BR>說明:采用這種松散方式編寫代碼的目的是使代碼更加清晰。<BR>由于留空格所產生的清晰性是相對的,所以,在已經非常清晰的語句中沒有必要再留空格,如果語句已足夠清晰則括號內側(即左括號后面和右括號前面)不需要加空格,多重括號間不必加空格,因為在C/C++語言中括號已經是最清晰的標志了。<BR>在長語句中,如果需要加的空格非常多,那么應該保持整體清晰,而在局部不加空格。給操作符留空格時不要連續留兩個以上空格。</P>
<P>示例:<BR>(1) 逗號、分號只在后面加空格。<BR>int a, b, c; </P>
<P>(2)比較操作符, 賦值操作符"="、 "+=",算術操作符"+"、"%",邏輯操作符"&&"、"&",位域操作符"<<"、"^"等雙目操作符的前后加空格。<BR>if (current_time >= MAX_TIME_VALUE) <BR>a = b + c;<BR>a *= 2;<BR>a = b ^ 2;</P>
<P>(3)"!"、"~"、"++"、"--"、"&"(地址運算符)等單目操作符前后不加空格。<BR>*p = 'a'; // 內容操作"*"與內容之間<BR>flag = !isEmpty; // 非操作"!"與內容之間<BR>p = &mem; // 地址操作"&" 與內容之間<BR>i++; // "++","--"與內容之間</P>
<P>(4)"->"、"."前后不加空格。<BR>p->id = pid; // "->"指針前后不加空格</P>
<P>(5) if、for、while、switch等與后面的括號間應加空格,使if等關鍵字更為突出、明顯。<BR>if (a >= b && c > d)<BR>&frac12; 1-1:一行程序以小于80字符為宜,不要寫得過長。<BR> <BR>2 注釋<BR>&sup1; 2-1:一般情況下,源程序有效注釋量必須在20%以上。<BR>說明:注釋的原則是有助于對程序的閱讀理解,在該加的地方都加了,注釋不宜太多也不能太少,注釋語言必須準確、易懂、簡潔。<BR>&sup1; 2-2:說明性文件(如頭文件.h文件、.inc文件、.def文件、編譯說明文件.cfg等)頭部應進行注釋,注釋必須列出:版權說明、版本號、生成日期、作者、內容、功能、與其它文件的關系、修改日志等,頭文件的注釋中還應有函數功能簡要說明。<BR>示例:下面這段頭文件的頭注釋比較標準,當然,并不局限于此格式,但上述信息建議要包含在內。<BR>/*************************************************<BR> Copyright (C), 1988-1999, Huawei Tech. Co., Ltd.<BR> File name: // 文件名<BR> Author: Version: Date: // 作者、版本及完成日期<BR> Description: // 用于詳細說明此程序文件完成的主要功能,與其他模塊<BR> // 或函數的接口,輸出值、取值范圍、含義及參數間的控<BR> // 制、順序、獨立或依賴等關系<BR> Others: // 其它內容的說明<BR> Function List: // 主要函數列表,每條記錄應包括函數名及功能簡要說明<BR> 1. ....<BR> History: // 修改歷史記錄列表,每條修改記錄應包括修改日期、修改<BR> // 者及修改內容簡述 <BR> 1. Date:<BR> Author:<BR> Modification:<BR> 2. ...<BR>*************************************************/<BR>&sup1; 2-3:源文件頭部應進行注釋,列出:版權說明、版本號、生成日期、作者、模塊目的/功能、主要函數及其功能、修改日志等。<BR>示例:下面這段源文件的頭注釋比較標準,當然,并不局限于此格式,但上述信息建議要包含在內。<BR>/************************************************************<BR> Copyright (C), 1988-1999, Huawei Tech. Co., Ltd.<BR> FileName: test.cpp<BR> Author: Version : Date:<BR> Description: // 模塊描述 <BR> Version: // 版本信息<BR> Function List: // 主要函數及其功能<BR> 1. -------<BR> History: // 歷史修改記錄<BR> <author> <time> <version > <desc><BR> David 96/10/12 1.0 build this moudle <BR>***********************************************************/<BR>說明:Description一項描述本文件的內容、功能、內部各部分之間的關系及本文件與其它文件關系等。History是修改歷史記錄列表,每條修改記錄應包括修改日期、修改者及修改內容簡述。<BR>&sup1; 2-4:函數頭部應進行注釋,列出:函數的目的/功能、輸入參數、輸出參數、返回值、調用關系(函數、表)等。<BR>示例:下面這段函數的注釋比較標準,當然,并不局限于此格式,但上述信息建議要包含在內。<BR>/*************************************************<BR> Function: // 函數名稱<BR> Description: // 函數功能、性能等的描述<BR> Calls: // 被本函數調用的函數清單<BR> Called By: // 調用本函數的函數清單<BR> Table Accessed: // 被訪問的表(此項僅對于牽扯到數據庫操作的程序)<BR> Table Updated: // 被修改的表(此項僅對于牽扯到數據庫操作的程序)<BR> Input: // 輸入參數說明,包括每個參數的作<BR> // 用、取值說明及參數間關系。<BR> Output: // 對輸出參數的說明。<BR> Return: // 函數返回值的說明<BR> Others: // 其它說明<BR>*************************************************/<BR>&sup1; 2-5:邊寫代碼邊注釋,修改代碼同時修改相應的注釋,以保證注釋與代碼的一致性。不再有用的注釋要刪除。<BR>&sup1; 2-6:注釋的內容要清楚、明了,含義準確,防止注釋二義性。<BR>說明:錯誤的注釋不但無益反而有害。<BR>規則2-7:避免在注釋中使用縮寫,特別是非常用縮寫。<BR>說明:在使用縮寫時或之前,應對縮寫進行必要的說明。<BR>&sup1; 2-8:注釋應與其描述的代碼相近,對代碼的注釋應放在其上方或右方(對單條語句的注釋)相鄰位置,不可放在下面,如放于上方則需與其上面的代碼用空行隔開。<BR>示例:如下例子不符合規范。<BR>例1:<BR>/* get replicate sub system index and net indicator */</P>
<P><BR>repssn_ind = ssn_data[index].repssn_index;<BR>repssn_ni = ssn_data[index].ni;</P>
<P>例2:<BR>repssn_ind = ssn_data[index].repssn_index;<BR>repssn_ni = ssn_data[index].ni;<BR>/* get replicate sub system index and net indicator */</P>
<P>應如下書寫<BR>/* get replicate sub system index and net indicator */<BR>repssn_ind = ssn_data[index].repssn_index;<BR>repssn_ni = ssn_data[index].ni;<BR>&sup1; 2-9:對于所有有物理含義的變量、常量,如果其命名不是充分自注釋的,在聲明時都必須加以注釋,說明其物理含義。變量、常量、宏的注釋應放在其上方相鄰位置或右方。<BR>示例:<BR>/* active statistic task number */<BR>#define MAX_ACT_TASK_NUMBER 1000</P>
<P>#define MAX_ACT_TASK_NUMBER 1000 /* active statistic task number */<BR>&sup1; 2-10:數據結構聲明(包括數組、結構、類、枚舉等),如果其命名不是充分自注釋的,必須加以注釋。對數據結構的注釋應放在其上方相鄰位置,不可放在下面;對結構中的每個域的注釋放在此域的右方。<BR>示例:可按如下形式說明枚舉/數據/聯合結構。<BR>/* sccp interface with sccp user primitive message name */<BR>enum SCCP_USER_PRIMITIVE<BR>{<BR> N_UNITDATA_IND, /* sccp notify sccp user unit data come */<BR> N_NOTICE_IND, /* sccp notify user the No.7 network can not */<BR> /* transmission this message */<BR> N_UNITDATA_REQ, /* sccp user's unit data transmission request*/<BR>};<BR>&sup1; 2-11:全局變量要有較詳細的注釋,包括對其功能、取值范圍、哪些函數或過程存取它以及存取時注意事項等的說明。<BR>示例:<BR>/* The ErrorCode when SCCP translate */<BR>/* Global Title failure, as follows */ // 變量作用、含義<BR>/* 0 - SUCCESS 1 - GT Table error */<BR>/* 2 - GT error Others - no use */ // 變量取值范圍<BR>/* only function SCCPTranslate() in */<BR>/* this modual can modify it, and other */<BR>/* module can visit it through call */<BR>/* the function GetGTTransErrorCode() */ // 使用方法<BR>BYTE g_GTTranErrorCode; <BR>&sup1; 2-12:注釋與所描述內容進行同樣的縮排。<BR>說明:可使程序排版整齊,并方便注釋的閱讀與理解。<BR>示例:如下例子,排版不整齊,閱讀稍感不方便。<BR>void example_fun( void )<BR>{<BR>/* code one comments */<BR> CodeBlock One</P>
<P> /* code two comments */<BR> CodeBlock Two<BR>}</P>
<P>應改為如下布局。<BR>void example_fun( void )<BR>{<BR> /* code one comments */<BR> CodeBlock One</P>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -