




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、成都信息工程學(xué)院非計(jì)算機(jī)專業(yè)c語(yǔ)言初學(xué)者編程規(guī)范(學(xué)生用)成都信息工程學(xué)院計(jì)算中心對(duì)于程序員來(lái)說(shuō),能工作的代碼并不等于“好”的代碼。“好”代碼的指標(biāo)很多,包括易讀、易維護(hù)、易移植和可靠等。其中,可靠性對(duì)嵌入式系統(tǒng)非常重要,尤其是在那些對(duì)安全性要求很高的系統(tǒng)中,如飛行器、汽車和工業(yè)控制中。這些系統(tǒng)的特點(diǎn)是:只要工作稍有偏差,就有可能造成重大損失或者人員傷亡。一個(gè)不容易出錯(cuò)的系統(tǒng),除了要有很好的硬件設(shè)計(jì)(如電磁兼容性),還要有很健壯或者說(shuō)“安全”的程序。然而,很少有程序員知道什么樣的程序是安全的程序。很多程序只是表面上可以干活,還存在著大量的隱患。當(dāng)然,這其中也有c語(yǔ)言自身的原因。因?yàn)閏語(yǔ)言是一門(mén)
2、難以掌握的語(yǔ)言,其靈活的編程方式和語(yǔ)法規(guī)則對(duì)于一個(gè)新手來(lái)說(shuō)很可能會(huì)成為機(jī)關(guān)重重的陷阱。同時(shí),c語(yǔ)言的定義還并不完全,即使是國(guó)際通用的c語(yǔ)言標(biāo)準(zhǔn),也還存在著很多未完全定義的地方。要求所有的嵌入式程序員都成為c語(yǔ)言專家,避開(kāi)所有可能帶來(lái)危險(xiǎn)的編程方式,是不現(xiàn)實(shí)的。最好的方法是有一個(gè)針對(duì)安全性的c語(yǔ)言編程規(guī)范,告訴程序員該如何做。本規(guī)范在制定過(guò)程中,主要參考了業(yè)界比較推崇的華為軟件編程規(guī)范和范例和misra 2004規(guī)則,適合于非計(jì)算機(jī)專業(yè)的c語(yǔ)言初學(xué)者使用,目的在于在教學(xué)中培養(yǎng)學(xué)生良好的編程規(guī)范和意識(shí)、素質(zhì),促進(jìn)所設(shè)計(jì)程序安全、健壯、可靠、可讀與可維護(hù)(程序簡(jiǎn)單、清晰)??紤]到面向的是初學(xué)者,為便
3、于教學(xué)和課程考核操作,本規(guī)范中的要求比較基本。事實(shí)上,很多公司都有自己規(guī)定的代碼風(fēng)格,包括命名規(guī)則、縮進(jìn)規(guī)則等,學(xué)生參加工作后,應(yīng)再進(jìn)一步學(xué)習(xí)和應(yīng)用公司的規(guī)范。建議學(xué)生在學(xué)習(xí)本規(guī)范的同時(shí),花點(diǎn)時(shí)間閱讀本規(guī)范的參考文獻(xiàn)原文,特別是熟讀本規(guī)范的參考文獻(xiàn)之一的“安全第一”的c語(yǔ)言編程規(guī)范,深刻理解編程規(guī)范與程序安全、健壯、可靠、可讀、可維護(hù)間的關(guān)系和作用,在學(xué)習(xí)和工作中養(yǎng)成良好的編程風(fēng)格。1 排版1.1 嚴(yán)格采用階梯層次組織程序代碼函數(shù)或過(guò)程的開(kāi)始、結(jié)構(gòu)的定義及循環(huán)、判斷等語(yǔ)句中的代碼都要采用縮進(jìn)風(fēng)格,case 語(yǔ)句下的情況處理語(yǔ)句也要遵從語(yǔ)句縮進(jìn)要求。程序塊的分界符(如c/c+ 語(yǔ)言的大括號(hào) 和)
4、應(yīng)各獨(dú)占一行并且位于同一列,同時(shí)與引用它們的語(yǔ)句左對(duì)齊。在函數(shù)體的開(kāi)始、類的定義、結(jié)構(gòu)的定義、枚舉的定義以及if 、for 、do 、while 、switch 、case 語(yǔ)句中的程序都要采用如上的縮進(jìn)方式。各層次縮進(jìn)的風(fēng)格采用tab縮進(jìn)(tab寬度原則上使用系統(tǒng)默認(rèn)值,tc使用8空格寬度,vc使用4空格寬度)。示例:if (x is true)we do yelseif (a b).else.和:if (x = y).else if (x y).else.注意,右括號(hào)所在的行不應(yīng)當(dāng)有其它東西,除非跟隨著一個(gè)條件判斷。也就是do-while語(yǔ)句中的“while”,象這樣:dobody of
5、do-loop while (condition);說(shuō)明:代碼離不開(kāi)縮進(jìn),縮進(jìn)背后的思想是:清楚地定義一個(gè)控制塊從哪里開(kāi)始,到哪里結(jié)束。尤其是在你連續(xù)不斷的盯了20個(gè)小時(shí)的屏幕后,如果你有大尺寸的縮進(jìn)。你將更容易發(fā)現(xiàn)縮進(jìn)的好處。關(guān)于縮進(jìn)主要有兩個(gè)爭(zhēng)論,一個(gè)是該用空格(space)還是用制表符(tab),另外一個(gè)是該用4格縮進(jìn)還是8格縮進(jìn)甚至都不是。建議總是使用tab縮進(jìn),因?yàn)閹缀跛械拇a(不僅僅是c代碼)都在使用tab縮進(jìn)?,F(xiàn)在,有些人說(shuō)8個(gè)字符大小的縮進(jìn)導(dǎo)致代碼太偏右了,并且在一個(gè)80字符寬的終端屏幕上看著很不舒服。對(duì)這個(gè)問(wèn)題的回答是:如果你有超過(guò)3個(gè)級(jí)別的縮進(jìn),你就有點(diǎn)犯糊涂了,應(yīng)當(dāng)修改
6、你的程序。簡(jiǎn)而言之,8個(gè)字符的縮進(jìn)使程序更易讀,而且當(dāng)你把功能隱藏的太深時(shí),多層次的縮進(jìn)還會(huì)對(duì)此很直觀的給出警告。要留心這種警告信息。例外:對(duì)于由開(kāi)發(fā)工具自動(dòng)生成的代碼可以有不一致。1.2 及時(shí)折行較長(zhǎng)的語(yǔ)句(80 字符)要分成多行書(shū)寫(xiě),長(zhǎng)表達(dá)式要在低優(yōu)先級(jí)操作符處劃分新行,操作符放在新行之首,劃分出的新行要進(jìn)行適當(dāng)?shù)目s進(jìn)(至少1個(gè)tab位置),使排版整齊,語(yǔ)句可讀。示例:report_or_not_flag = (taskno max_act_task_number)& (n7stat_stat_item_valid (stat_item)& (act_task_tabletaskno.re
7、sult_data != 0);循環(huán)、判斷等語(yǔ)句中若有較長(zhǎng)的表達(dá)式或語(yǔ)句,則要進(jìn)行適應(yīng)的劃分,長(zhǎng)表達(dá)式要在低優(yōu)先級(jí)操作符處劃分新行,操作符放在新行之首。示例:if (taskno max_act_task_number)& (n7stat_stat_item_valid (stat_item). / program codefor (i = 0, j = 0; (i bufferkeywordword_index.word_length)& (j newkeyword.word_length); i+, j+). / program codefor (i = 0, j = 0;(i first
8、_word_length) & (j ),后不應(yīng)加空格。采用這種松散方式編寫(xiě)代碼的目的是使代碼更加清晰。由于留空格所產(chǎn)生的清晰性是相對(duì)的,所以,在已經(jīng)非常清晰的語(yǔ)句中沒(méi)有必要再留空格,如果語(yǔ)句已足夠清晰則括號(hào)內(nèi)側(cè)(即左括號(hào)后面和右括號(hào)前面)不需要加空格,多重括號(hào)間不必加空格,因?yàn)樵赾/c+語(yǔ)言中括號(hào)已經(jīng)是最清晰的標(biāo)志了。在長(zhǎng)語(yǔ)句中,如果需要加的空格非常多,那么應(yīng)該保持整體清晰,而在局部不加空格。給操作符留空格時(shí)不要連續(xù)留兩個(gè)以上空格。(1)逗號(hào)、分號(hào)只在后面加空格。int a, b, c;(2)比較操作符, 賦值操作符=、 +=,算術(shù)操作符+、%,邏輯操作符&、&,位域操作符= max_tim
9、e_value)a = b + c;a *= 2;a = b 2;(3)!、+、-、&(地址運(yùn)算符)等單目操作符前后不加空格。*p = a; / 內(nèi)容操作*與內(nèi)容之間flag = !isempty; / 非操作!與內(nèi)容之間p = &mem; / 地址操作& 與內(nèi)容之間i+; / +,-與內(nèi)容之間(4)-、.前后不加空格。p-id = pid; / -指針前后不加空格(5) if、for、while、switch等與后面的括號(hào)間應(yīng)加空格,使if等關(guān)鍵字更為突出、明顯。if (a = b & c d)1.7 對(duì)變量的定義,盡量位于函數(shù)的開(kāi)始位置(1)應(yīng)避免分散定義變量。(2)同一行內(nèi)不要定義過(guò)多變
10、量。 (3)同一類的變量在同一行內(nèi)定義,或者在相鄰行定義。 (4)數(shù)組、指針等復(fù)雜類型的定義放在定義區(qū)的最后。 (5)變量定義區(qū)不做較復(fù)雜的變量賦值。1.8 程序各部分的放置順序在較小的項(xiàng)目中,按如下順序組織安排程序各部分:(1)#include 。(2)#include 用戶自定義的文件。(3)#define 宏定義。(4)全局變量定義。(5)函數(shù)原型聲明。(6)main函數(shù)定義。(7)用戶自定義函數(shù)。以上各部分之間、用戶自定義的函數(shù)之間應(yīng)加空行。注意,函數(shù)原型聲明統(tǒng)一集中放在main函數(shù)之前,不放在某個(gè)函數(shù)內(nèi)部。2 注釋2.1 注釋的原則和目的注釋的原則是有助于對(duì)程序的閱讀理解,在該加的地
11、方都加了,注釋不宜太多也不能太少,注釋語(yǔ)言必須準(zhǔn)確、易懂、簡(jiǎn)潔。通過(guò)對(duì)函數(shù)或過(guò)程、變量、結(jié)構(gòu)等正確的命名以及合理地組織代碼的結(jié)構(gòu),使代碼成為自注釋的清晰準(zhǔn)確的函數(shù)、變量等的命名,可增加代碼可讀性,并減少不必要的注釋過(guò)量的注釋則是有害的。注釋的目的是解釋代碼的目的、功能和采用的方法,提供代碼以外的信息,幫助讀者理解代碼,防止沒(méi)必要的重復(fù)注釋信息。 示例:如下注釋意義不大。/* if receive_flag is true */if (receive_flag)而如下的注釋則給出了額外有用的信息。/* if mtp receive a message from links */if (recei
12、ve_flag)2.2 函數(shù)頭部應(yīng)進(jìn)行注釋函數(shù)頭部應(yīng)進(jìn)行注釋,列出:函數(shù)的目的/ 功能、輸入?yún)?shù)、輸出參數(shù)、返回值、調(diào)用關(guān)系(函數(shù)、表)等。示例1:下面這段函數(shù)的注釋比較標(biāo)準(zhǔn),當(dāng)然,并不局限于此格式,但上述信息建議要包含在內(nèi)。/* function: / 函數(shù)名稱 description: / 函數(shù)功能、性能等的描述 calls: / 被本函數(shù)調(diào)用的函數(shù)清單 called by: / 調(diào)用本函數(shù)的函數(shù)清單 input: / 輸入?yún)?shù)說(shuō)明,包括每個(gè)參數(shù)的作 / 用、取值說(shuō)明及參數(shù)間關(guān)系。 output: / 對(duì)輸出參數(shù)的說(shuō)明。 return: / 函數(shù)返回值的說(shuō)明 others: / 其它說(shuō)明*
13、/對(duì)于某些函數(shù),其部分參數(shù)為傳入值,而部分參數(shù)為傳出值,所以對(duì)參數(shù)要詳細(xì)說(shuō)明該參數(shù)是入口參數(shù),還是出口參數(shù),對(duì)于某些意義不明確的參數(shù)還要做詳細(xì)說(shuō)明(例如:以角度作為參數(shù)時(shí),要說(shuō)明該角度參數(shù)是以弧度(pi),還是以度為單位),對(duì)既是入口又是出口的變量應(yīng)該在入口和出口處同時(shí)標(biāo)明。等等。在注釋中詳細(xì)注明函數(shù)的適當(dāng)調(diào)用方法,對(duì)于返回值的處理方法等。在注釋中要強(qiáng)調(diào)調(diào)用時(shí)的危險(xiǎn)方面,可能出錯(cuò)的地方。2.3 進(jìn)行注釋時(shí)的注意事項(xiàng)(1)建議邊寫(xiě)代碼邊注釋,修改代碼同時(shí)修改相應(yīng)的注釋,以保證注釋與代碼的一致性。不再有用的注釋要?jiǎng)h除。(2)注釋的內(nèi)容要清楚、明了,含義準(zhǔn)確,防止注釋二義性。說(shuō)明:錯(cuò)誤的注釋不但無(wú)益
14、反而有害。(3)避免在注釋中使用縮寫(xiě),特別是非常用縮寫(xiě)。在使用縮寫(xiě)時(shí)或之前,應(yīng)對(duì)縮寫(xiě)進(jìn)行必要的說(shuō)明。(4)注釋?xiě)?yīng)與其描述的代碼相近,對(duì)代碼的注釋?xiě)?yīng)放在其上方或右方(對(duì)單條語(yǔ)句的注釋)相鄰位置,不可放在下面。除非必要,不應(yīng)在代碼或表達(dá)中間插入注釋,否則容易使代碼可理解性變差。示例:如下例子不符合規(guī)范。例1:/* get replicate sub system index and net indicator */repssn_ind = ssn_dataindex.repssn_index;repssn_ni = ssn_dataindex.ni;例2:repssn_ind = ssn_data
15、index.repssn_index;repssn_ni = ssn_dataindex.ni;/* get replicate sub system index and net indicator */應(yīng)如下書(shū)寫(xiě)/* get replicate sub system index and net indicator */repssn_ind = ssn_dataindex.repssn_index;repssn_ni = ssn_dataindex.ni;(5)對(duì)于所有有物理含義的變量、常量,如果其命名不是充分自注釋的,在聲明時(shí)都必須加以注釋,說(shuō)明其物理含義。變量、常量、宏的注釋?xiě)?yīng)放在其上方相
16、鄰位置或右方。示例:/* active statistic task number */#define max_act_task_number 1000#define max_act_task_number 1000 /* active statistic task number */(6)數(shù)據(jù)結(jié)構(gòu)聲明( 包括數(shù)組、結(jié)構(gòu)、類、枚舉等) ,如果其命名不是充分自注釋的,必須加以注釋。對(duì)數(shù)據(jù)結(jié)構(gòu)的注釋?xiě)?yīng)放在其上方相鄰位置,不可放在下面;對(duì)結(jié)構(gòu)中的每個(gè)域的注釋放在此域的右方。示例:可按如下形式說(shuō)明枚舉/數(shù)據(jù)/聯(lián)合結(jié)構(gòu)。/* sccp interface with sccp user primitive
17、 message name */enum sccp_user_primitiven_unitdata_ind, /* sccp notify sccp user unit data come */n_notice_ind, /* sccp notify user the no.7 network can not */* transmission this message */n_unitdata_req, /* sccp users unit data transmission request*/;(7)全局變量要有較詳細(xì)的注釋,包括對(duì)其功能、取值范圍、哪些函數(shù)或過(guò)程存取它以及存取時(shí)注意事項(xiàng)等
18、的說(shuō)明。示例:/* the errorcode when sccp translate */* global title failure, as follows */ / 變量作用、含義/* 0 success 1 gt table 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 getgtt
19、ranserrorcode() */ / 使用方法byte g_gttranerrorcode;(8)注釋與所描述內(nèi)容進(jìn)行同樣的縮排,讓程序排版整齊,并方便注釋的閱讀與理解。示例:如下例子,排版不整齊,閱讀稍感不方便。void example_fun( void )/* code one comments */codeblock one/* code two comments */ codeblock two應(yīng)改為如下布局。void example_fun( void )/* code one comments */codeblock one/* code two comments */cod
20、eblock two(9)將注釋與其上面的代碼用空行隔開(kāi)。示例:如下例子,顯得代碼過(guò)于緊湊。/* code one comments */program code one/* code two comments */program code two應(yīng)如下書(shū)寫(xiě)/* code one comments */program code one/* code two comments */program code two(10)對(duì)變量的定義和分支語(yǔ)句(條件分支、循環(huán)語(yǔ)句等)必須編寫(xiě)注釋。這些語(yǔ)句往往是程序?qū)崿F(xiàn)某一特定功能的關(guān)鍵,對(duì)于維護(hù)人員來(lái)說(shuō),良好的注釋幫助更好的理解程序,有時(shí)甚至優(yōu)于看設(shè)計(jì)文檔。(1
21、1)對(duì)于switch 語(yǔ)句下的case 語(yǔ)句,如果因?yàn)樘厥馇闆r需要處理完一個(gè)case 后進(jìn)入下一個(gè)case 處理(即上一個(gè)case后無(wú)break),必須在該case 語(yǔ)句處理完、下一個(gè)case 語(yǔ)句前加上明確的注釋,以清楚表達(dá)程序編寫(xiě)者的意圖,有效防止無(wú)故遺漏break語(yǔ)句(可避免后期維護(hù)人員對(duì)此感到迷惑:原程序員是遺漏了break語(yǔ)句還是本來(lái)就不應(yīng)該有)。示例:case cmd_down:processdown();break;case cmd_fwd:processfwd();if (.).break; elseprocesscfw_b(); / now jump into case cm
22、d_acase cmd_a:processa();break;.(12)在程序塊的結(jié)束行右方加注釋標(biāo)記,以表明某程序塊的結(jié)束。當(dāng)代碼段較長(zhǎng),特別是多重嵌套時(shí),這樣做可以使代碼更清晰,更便于閱讀。示例:參見(jiàn)如下例子。if (.)program codewhile (index max_index)program code /* end of while (index tmp、flag-flg、statistic-stat、increment-inc、message-msg等縮寫(xiě)能夠被大家基本認(rèn)可。(2)命名中若使用特殊約定或縮寫(xiě),則要有注釋說(shuō)明。應(yīng)該在源文件的開(kāi)始之處,對(duì)文件中所使用的縮寫(xiě)或約定
23、,特別是特殊的縮寫(xiě),進(jìn)行必要的注釋說(shuō)明。(3)自己特有的命名風(fēng)格,要自始至終保持一致,不可來(lái)回變化。個(gè)人的命名風(fēng)格,在符合所在項(xiàng)目組或產(chǎn)品組的命名規(guī)則的前提下,才可使用。(即命名規(guī)則中沒(méi)有規(guī)定到的地方才可有個(gè)人命名風(fēng)格)。(4)對(duì)于變量命名,禁止取單個(gè)字符(如i 、j 、k. ),建議除了要有具體含義外,還能表明其變量類型、數(shù)據(jù)類型等,但i 、j 、k 作局部循環(huán)變量是允許的。變量,尤其是局部變量,如果用單個(gè)字符表示,很容易敲錯(cuò)(如i寫(xiě)成j),而編譯時(shí)又檢查不出來(lái),有可能為了這個(gè)小小的錯(cuò)誤而花費(fèi)大量的查錯(cuò)時(shí)間。(5)除非必要,不要用數(shù)字或較奇怪的字符來(lái)定義標(biāo)識(shí)符。(6)命名規(guī)范必須與所使用的系
24、統(tǒng)風(fēng)格保持一致,并在同一項(xiàng)目中統(tǒng)一。(7)在同一軟件產(chǎn)品內(nèi),應(yīng)規(guī)劃好接口部分標(biāo)識(shí)符(變量、結(jié)構(gòu)、函數(shù)及常量)的命名,防止編譯、鏈接時(shí)產(chǎn)生沖突。對(duì)接口部分的標(biāo)識(shí)符應(yīng)該有更嚴(yán)格限制,防止沖突。如可規(guī)定接口部分的變量與常量之前加上“模塊”標(biāo)識(shí)等。(8)用正確的反義詞組命名具有互斥意義的變量或相反動(dòng)作的函數(shù)等。下面是一些在軟件中常用的反義詞組。add / remove begin / end create / destroyinsert / delete first / last g et / releaseincrement / decrement put / getadd / delete loc
25、k / unlock open / closemin / max old / new start / stopnext / previous source / target show / hidesend / receive source / destinationcut / paste up / down示例:int min_sum;int max_sum;int add_user( byte *user_name );int delete_user( byte *user_name );(9)除了編譯開(kāi)關(guān)/ 頭文件等特殊應(yīng)用,應(yīng)避免使用_example_test_ 之類以下劃線開(kāi)始和結(jié)尾的
26、定義。3.3 變量名的命名規(guī)則(1)變量的命名規(guī)則要求用“匈牙利法則”。即開(kāi)頭字母用變量的類型,其余部分用變量的英文意思、英文的縮寫(xiě)、中文全拼或中文全拼的縮寫(xiě),要求單詞的第一個(gè)字母應(yīng)大寫(xiě)。即: 變量名=變量類型+變量的英文意思(或英文縮寫(xiě)、中文全拼、中文全拼縮寫(xiě))對(duì)非通用的變量,在定義時(shí)加入注釋說(shuō)明,變量定義盡量可能放在函數(shù)的開(kāi)始處。見(jiàn)下表:bool 用b開(kāi)頭 bflgint 用i開(kāi)頭 icountshort int 用n開(kāi)頭 nstepcountlong int 用l開(kāi)頭 lsumchar 用c開(kāi)頭 ccountunsigned char 用by開(kāi)頭float 用f開(kāi)頭 favgdouble
27、 用d開(kāi)頭 ddetaunsigned int(word) 用w開(kāi)頭 wcountunsigned long int(dword) 用dw開(kāi)頭 dwbroad字符串 用s開(kāi)頭 sfilename用0結(jié)尾的字符串 用sz開(kāi)頭 szfilename(2)指針變量命名的基本原則為:對(duì)一重指針變量的基本原則為:“p”+變量類型前綴+命名,如一個(gè)float*型應(yīng)該表示為pfstat。對(duì)二重指針變量的基本規(guī)則為:“pp”+變量類型前綴+命名。對(duì)三重指針變量的基本規(guī)則為:“ppp”+變量類型前綴+命名。(3)全局變量用g_開(kāi)頭,如一個(gè)全局的長(zhǎng)型變量定義為g_lfailcount,即:變量名=g_+變量類型+
28、變量的英文意思(或縮寫(xiě))。此規(guī)則還可避免局部變量和全局變量同名而引起的問(wèn)題。(4)靜態(tài)變量用s_開(kāi)頭,如一個(gè)靜態(tài)的指針變量定義為s_plperv_inst,即: 變量名=s_+變量類型+變量的英文意思(或縮寫(xiě))(5)對(duì)枚舉類型(enum)中的變量,要求用枚舉變量或其縮寫(xiě)做前綴。并且要求用大寫(xiě)。如:enum cmemdaysemdays_monday;emdays_tuesday;(6)對(duì)struct、union變量的命名要求定義的類型用大寫(xiě)。并要加上前綴,其內(nèi)部變量的命名規(guī)則與變量命名規(guī)則一致。結(jié)構(gòu)一般用s開(kāi)頭,如:struct scmnpointint nx;/點(diǎn)的x位置int ny; /點(diǎn)
29、的y位置;聯(lián)合體一般用u開(kāi)頭,如:union ucmlpointlong lx;long ly;(7)對(duì)常量(包括錯(cuò)誤的編碼)命名,要求常量名用大寫(xiě),常量名用英文表達(dá)其意思。當(dāng)需要由多個(gè)單詞表示時(shí),單詞與單詞之間必須采用連字符“_”連接。如:#define cm_file_not_found cmmakehr(0x20b) 其中cm表示類別。(8)對(duì)const 的變量要求在變量的命名規(guī)則前加入c_,即:c_+變量命名規(guī)則;示例:const char* c_szfilename;3.4 函數(shù)的命名規(guī)范(1)函數(shù)的命名應(yīng)該盡量用英文(或英文縮寫(xiě)、中文全拼、中文全拼縮寫(xiě))表達(dá)出函數(shù)完成的功能函數(shù)名應(yīng)
30、準(zhǔn)確描述函數(shù)的功能。遵循動(dòng)賓結(jié)構(gòu)的命名法則,函數(shù)名中動(dòng)詞在前,并在命名前加入函數(shù)的前綴,函數(shù)名的長(zhǎng)度不得少于8個(gè)字母。函數(shù)名首字大寫(xiě),若包含有兩個(gè)單詞的每個(gè)單詞首字母大寫(xiě)。如果是oop 方法,可以只有動(dòng)詞(名詞是對(duì)象本身)。示例:long getdevicecount();void print_record( unsigned int rec_ind ) ;int input_record( void ) ;unsigned char get_current_color( void ) ;(2)避免使用無(wú)意義或含義不清的動(dòng)詞為函數(shù)命名。如使用process、handle等為函數(shù)命名,因?yàn)檫@些動(dòng)
31、詞并沒(méi)有說(shuō)明要具體做什么。(3)必須使用函數(shù)原型聲明。函數(shù)原型聲明包括:引用外來(lái)函數(shù)及內(nèi)部函數(shù),外部引用必須在右側(cè)注明函數(shù)來(lái)源: 模塊名及文件名;內(nèi)部函數(shù),只要注釋其定義文件名和調(diào)用者在同一文件中(簡(jiǎn)單程序)時(shí)不需要注釋。應(yīng)確保每個(gè)函數(shù)聲明中的參數(shù)的名稱、類型和定義中的名稱、類型一致。3.5 函數(shù)參數(shù)命名規(guī)范(1)參數(shù)名稱的命名參照變量命名規(guī)范。(2)為了提高程序的運(yùn)行效率,減少參數(shù)占用的堆棧,傳遞大結(jié)構(gòu)的參數(shù),一律采用指針或引用方式傳遞。(3)為了便于其他程序員識(shí)別某個(gè)指針參數(shù)是入口參數(shù)還是出口參數(shù),同時(shí)便于編譯器檢查錯(cuò)誤,應(yīng)該在入口參數(shù)前加入const標(biāo)志。如:cmcopystring(c
32、onst char * c_szsource, char * szdest)3.6 文件名(包括動(dòng)態(tài)庫(kù)、組件、控件、工程文件等)的命名規(guī)范文件名的命名要求表達(dá)出文件的內(nèi)容,要求文件名的長(zhǎng)度不得少于5個(gè)字母,嚴(yán)禁使用象file1,myfile之類的文件名。4 可讀性4.1 避免使用默認(rèn)的運(yùn)算優(yōu)先級(jí)注意運(yùn)算符的優(yōu)先級(jí),并用括號(hào)明確表達(dá)式的操作順序,避免使用默認(rèn)優(yōu)先級(jí),可防止閱讀程序時(shí)產(chǎn)生誤解,防止因默認(rèn)的優(yōu)先級(jí)與設(shè)計(jì)思想不符而導(dǎo)致程序出錯(cuò)。示例:下列語(yǔ)句中的表達(dá)式word = (high 8) | low (1)if (a | b) & (a & c) (2)if (a | b) (c & d)
33、(3)如果書(shū)寫(xiě)為:high 8 | lowa | b & a & ca | b c & d由于high 8 | low = ( high 8) | low,a | b & a & c = (a | b) & (a & c),(1)(2)不會(huì)出錯(cuò),但語(yǔ)句不易理解;a | b c & d = a | (b b ) ? a : b ;改為如下就很清晰了。int max (int a, int b)return (a b) ? a : b);value = max (a, b);或改為如下。#define max (a, b) (a) (b) ? (a) : (b)value = max (a, b)
34、;當(dāng)一個(gè)過(guò)程(函數(shù))中對(duì)較長(zhǎng)變量(一般是結(jié)構(gòu)的成員)有較多引用時(shí),可以用一個(gè)意義相當(dāng)?shù)暮甏孢@樣可以增加編程效率和程序的可讀性。 示例:在某過(guò)程中較多引用thereceivebufferfirstsocket.bydataptr,則可以通過(guò)以下宏定義來(lái)代替:# define psockdata thereceivebufferfirstscoket.bydataptr(3)防止把沒(méi)有關(guān)聯(lián)的語(yǔ)句放到一個(gè)函數(shù)中,防止函數(shù)或過(guò)程內(nèi)出現(xiàn)隨機(jī)內(nèi)聚。隨機(jī)內(nèi)聚是指將沒(méi)有關(guān)聯(lián)或關(guān)聯(lián)很弱的語(yǔ)句放到同一個(gè)函數(shù)或過(guò)程中。隨機(jī)內(nèi)聚給函數(shù)或過(guò)程的維護(hù)、測(cè)試及以后的升級(jí)等造成了不便,同時(shí)也使函數(shù)或過(guò)程的功能不明確。使用隨
35、機(jī)內(nèi)聚函數(shù),常常容易出現(xiàn)在一種應(yīng)用場(chǎng)合需要改進(jìn)此函數(shù),而另一種應(yīng)用場(chǎng)合又不允許這種改進(jìn),從而陷入困境。在編程時(shí),經(jīng)常遇到在不同函數(shù)中使用相同的代碼,許多開(kāi)發(fā)人員都愿把這些代碼提出來(lái),并構(gòu)成一個(gè)新函數(shù)。若這些代碼關(guān)聯(lián)較大并且是完成一個(gè)功能的,那么這種構(gòu)造是合理的,否則這種構(gòu)造將產(chǎn)生隨機(jī)內(nèi)聚的函數(shù)。示例:如下函數(shù)就是一種隨機(jī)內(nèi)聚。void init_var( void )rect.length = 0;rect.width = 0; /* 初始化矩形的長(zhǎng)與寬 */point.x = 10;point.y = 10; /* 初始化“點(diǎn)”的坐標(biāo) */矩形的長(zhǎng)、寬與點(diǎn)的坐標(biāo)基本沒(méi)有任何關(guān)系,故以上函數(shù)是
36、隨機(jī)內(nèi)聚。應(yīng)如下分為兩個(gè)函數(shù):void init_rect( void )rect.length = 0;rect.width = 0; /* 初始化矩形的長(zhǎng)與寬 */void init_point( void )point.x = 10;point.y = 10; /* 初始化“點(diǎn)”的坐標(biāo) */(4)如果多段代碼重復(fù)做同一件事情,那么在函數(shù)的劃分上可能存在問(wèn)題。若此段代碼各語(yǔ)句之間有實(shí)質(zhì)性關(guān)聯(lián)并且是完成同一件功能的,那么可考慮把此段代碼構(gòu)造成一個(gè)新的函數(shù)。(5)減少函數(shù)本身或函數(shù)間的遞歸調(diào)用。遞歸調(diào)用特別是函數(shù)間的遞歸調(diào)用(如a-b-c-a),影響程序的可理解性;遞歸調(diào)用一般都占用較多的系統(tǒng)
37、資源(如??臻g);遞歸調(diào)用對(duì)程序的測(cè)試有一定影響。故除非為某些算法或功能的實(shí)現(xiàn)方便,應(yīng)減少?zèng)]必要的遞歸調(diào)用,對(duì)于safe-related 系統(tǒng)不能用遞歸,因?yàn)槌龆褩?臻g很危險(xiǎn)。6.2 函數(shù)的返回值(1)對(duì)于函數(shù)的返回位置,盡量保持單一性,即一個(gè)函數(shù)盡量做到只有一個(gè)返回位置。(單入口單出口)。要求大家統(tǒng)一函數(shù)的返回值,所有的函數(shù)的返回值都將以編碼的方式返回。例如編碼定義如下:#define cm_point_is_null cmmakehr(0x200):建議函數(shù)實(shí)現(xiàn)如下:long 函數(shù)名(參數(shù),)long lresult; /保持錯(cuò)誤號(hào)lresult=cm_ok;/如果參數(shù)有錯(cuò)誤則返回錯(cuò)誤號(hào)
38、if(參數(shù)=null)lresult=cm_point_is_null;goto end;end:return lresult;(2)除非必要,最好不要把與函數(shù)返回值類型不同的變量,以編譯系統(tǒng)默認(rèn)的轉(zhuǎn)換方式或強(qiáng)制的轉(zhuǎn)換方式作為返回值返回。(3)函數(shù)的返回值要清楚、明了,讓使用者不容易忽視錯(cuò)誤情況。函數(shù)的每種出錯(cuò)返回值的意義要清晰、明了、準(zhǔn)確,防止使用者誤用、理解錯(cuò)誤或忽視錯(cuò)誤返回碼。(4)函數(shù)的功能應(yīng)該是可以預(yù)測(cè)的,也就是只要輸入數(shù)據(jù)相同就應(yīng)產(chǎn)生同樣的輸出。帶有內(nèi)部“存儲(chǔ)器”的函數(shù)的功能可能是不可預(yù)測(cè)的,因?yàn)樗妮敵隹赡苋Q于內(nèi)部存儲(chǔ)器(如某標(biāo)記)的狀態(tài)。這樣的函數(shù)既不易于理解又不利于測(cè)試和維
39、護(hù)。在c/c+語(yǔ)言中,函數(shù)的static局部變量是函數(shù)的內(nèi)部存儲(chǔ)器,有可能使函數(shù)的功能不可預(yù)測(cè),然而,當(dāng)某函數(shù)的返回值為指針類型時(shí),則必須是static的局部變量的地址作為返回值,若為auto類,則返回為錯(cuò)針。示例:如下函數(shù),其返回值(即功能)是不可預(yù)測(cè)的。unsigned int integer_sum( unsigned int base )unsigned int index;static unsigned int sum = 0; / 注意,是static類型的。 / 若改為auto類型,則函數(shù)即變?yōu)榭深A(yù)測(cè)。for (index = 1; index = base; index+)sum += index;return sum;6.3
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中國(guó)變壓器容量測(cè)試儀市場(chǎng)調(diào)查研究報(bào)告
- 籃球行進(jìn)間運(yùn)球 教學(xué)設(shè)計(jì)-2023-2024學(xué)年高一上學(xué)期體育與健康人教版必修第一冊(cè)
- Unit 1 Laugh out loud Understanding ideas 教學(xué)設(shè)計(jì)-2024-2025學(xué)年高中英語(yǔ)外研版(2019)選擇性必修第一冊(cè)
- 2024-2025學(xué)年高中數(shù)學(xué)第一章集合與函數(shù)概念1.3.2奇偶性第1課時(shí)函數(shù)奇偶性的概念應(yīng)用案鞏固提升新人教A版必修1
- 2024-2025學(xué)年新教材高中政治1.2.1使市場(chǎng)在資源配置中起決定性作用課堂訓(xùn)練含解析部編版必修2
- 2024-2025學(xué)年高中語(yǔ)文第3課囚綠記教案新人教版必修2
- 第二課《規(guī)則和秩序記心間》(教學(xué)設(shè)計(jì))-2023-2024學(xué)年三年級(jí)上冊(cè)綜合實(shí)踐活動(dòng)滬科黔科版
- 2024-2025學(xué)年新教材高中歷史課時(shí)素養(yǎng)評(píng)價(jià)七隋唐制度的變化與創(chuàng)新新人教版必修中外歷史綱要上
- 高中信息技術(shù)選修2教學(xué)設(shè)計(jì)-3.1 常見(jiàn)的多媒體信息5-粵教版
- 信息技術(shù)與體育學(xué)科整合的教學(xué)設(shè)計(jì)-《守門(mén)員撲接球動(dòng)作》
- 老化箱點(diǎn)檢表A4版本
- 河口區(qū)自然資源
- 音標(biāo)教學(xué)課件(共73張PPT)
- 精益改善項(xiàng)目管理制度
- 2012數(shù)據(jù)結(jié)構(gòu)英文試卷A及答案
- 機(jī)翼結(jié)構(gòu)(課堂PPT)
- 二次回路施工驗(yàn)收
- 自由組合定律的應(yīng)用9331的變式
- 唐河縣骨干網(wǎng)評(píng)員登記表
- 危險(xiǎn)廢物利用和處置方式代碼表
- 井下使用切割機(jī)安全技術(shù)措施
評(píng)論
0/150
提交評(píng)論