




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
軟件設(shè)計規(guī)范制訂:審核:同意:文獻(xiàn)編號生效日期版本號分發(fā)部門修訂履歷序號版本修訂內(nèi)容修訂人修訂日期會簽與文獻(xiàn)發(fā)放:會簽部門會簽人會簽日期簽收部門簽收人簽收日期深圳市德卡科技有限公司文獻(xiàn)編號文獻(xiàn)版本A1生效日期軟件設(shè)計規(guī)范發(fā)行類別■新增□修訂發(fā)行部門研發(fā)中心目錄HYPERLINK第一章、項(xiàng)目模塊劃分 15HYPERLINK一、模塊劃分 15HYPERLINK二、模塊命名 15HYPERLINK第二章、文獻(xiàn)格式 15HYPERLINK一、c文獻(xiàn)格式闡明: 16HYPERLINK1、文獻(xiàn)創(chuàng)立及修改闡明區(qū) 16HYPERLINK2、頭文獻(xiàn)引用區(qū) 16HYPERLINK3、全局變量定義區(qū) 16HYPERLINK4、驅(qū)動函數(shù)區(qū) 16HYPERLINK5、應(yīng)用函數(shù)區(qū) 17HYPERLINK6、文獻(xiàn)結(jié)束闡明 17HYPERLINK二、h文獻(xiàn)格式闡明 17HYPERLINK1、文獻(xiàn)創(chuàng)立及修改闡明區(qū) 17HYPERLINK2、防重調(diào)用定義 18HYPERLINK3、頭文獻(xiàn)引用 18HYPERLINK4、控制接口定義區(qū) 18HYPERLINK5、常量定義區(qū) 19HYPERLINK6、宏調(diào)用定義區(qū) 19HYPERLINK7、類型定義區(qū) 19HYPERLINK8、外部引用變量區(qū) 19HYPERLINK9、外部引用函數(shù)區(qū) 20HYPERLINK10、操作流程闡明區(qū) 20HYPERLINK11、文獻(xiàn)結(jié)束闡明 20HYPERLINK第三章、命名規(guī)則 21HYPERLINK一、函數(shù)命名規(guī)則 21HYPERLINK二、變量命名規(guī)則 21HYPERLINK三、宏命名規(guī)則 22HYPERLINK四、文獻(xiàn)命名規(guī)則 22HYPERLINK五、新定義變量類型命名規(guī)則 22HYPERLINK六、命名注意事項(xiàng): 22HYPERLINK1、標(biāo)記符命名基本原則 23HYPERLINK2、命名中若使用特殊商定或縮寫,則要有注釋闡明 23HYPERLINK3、局部循環(huán)變量也必須按照變量命名規(guī)則來定義 23HYPERLINK4、不要用數(shù)字或較奇怪的字符來定義標(biāo)記符 23HYPERLINK5、用對的的反義詞組命名含有互斥意義的變量或相反動作的函數(shù)等 23HYPERLINK6、避免使用下列劃線開始和結(jié)尾的定義 23HYPERLINK7、程序中不要出現(xiàn)僅靠大小寫辨別的相似的標(biāo)記符 23HYPERLINK8、標(biāo)記符縮寫 24HYPERLINK9、函數(shù)名應(yīng)精確描述函數(shù)的功效 24HYPERLINK10、避免使用無意義或含義不清的動詞為函數(shù)命名 24HYPERLINK第四章、代碼書寫規(guī)范 24HYPERLINK一、基本原則 24HYPERLINK二、排版 24HYPERLINK1、縮進(jìn)風(fēng)格 24HYPERLINK2、不要使用【TAB】鍵 24HYPERLINK3、空行 24HYPERLINK4、語句長度要不大于80個字符 25HYPERLINK5、長語句換行 25HYPERLINK6、長體現(xiàn)式換行 26HYPERLINK7、若函數(shù)的參數(shù)較長,則要進(jìn)行合適的劃分 26HYPERLINK8、一行只寫一條語句 26HYPERLINK9、括號{} 27HYPERLINK10、語句縮進(jìn)規(guī)定 27HYPERLINK11、分界符 28HYPERLINK12、空格 29HYPERLINK三、注釋 30HYPERLINK1、注釋量 30HYPERLINK2、函數(shù)頭部注釋 30HYPERLINK3、代碼與注釋同時修改 31HYPERLINK4、注釋的內(nèi)容要清晰、明了,含義精確,避免注釋二義性 31HYPERLINK5、避免在注釋中使用縮寫,特別是非慣用縮寫 31HYPERLINK6、注釋書寫位置 31HYPERLINK7、變量、常量命名不能充足自注釋的,必須加以注釋 32HYPERLINK8、數(shù)據(jù)構(gòu)造命名不能充足自注釋的,必須加以注釋 32HYPERLINK9、全局變量注釋 32HYPERLINK10、注釋要與說描述的內(nèi)容進(jìn)行同樣的縮排 32HYPERLINK11、將注釋與其上面的代碼用空行隔開 33HYPERLINK12、持續(xù)case語句解決時,必須編寫注釋 34HYPERLINK13、代碼或體現(xiàn)式的中間嚴(yán)禁插入注釋 36HYPERLINK14、通過對的命名使代碼成為自注釋的 36HYPERLINK15、在代碼的功效、意圖層次上進(jìn)行注釋,提供有用、額外的信息 36HYPERLINK16、在程序塊的結(jié)束行右方加注釋標(biāo)記,以表明某程序塊的結(jié)束 36HYPERLINK17、注釋格式 37HYPERLINK18、采用中文注釋 37HYPERLINK19、使用#if0和#endif注釋代碼塊 37HYPERLINK20、注釋不能嵌套 37HYPERLINK四、代碼可讀性 37HYPERLINK1、使用小括號明確體現(xiàn)式的操作次序 37HYPERLINK2、用故意義的枚舉和宏替代數(shù)字 38HYPERLINK3、源程序中關(guān)系較為緊密的代碼應(yīng)盡量相鄰 39HYPERLINK4、用多行簡樸語句替代復(fù)雜語句 39HYPERLINK五、變量,構(gòu)造 40HYPERLINK1、公共變量 40HYPERLINK1.1、去掉沒必要的公共變量 40HYPERLINK1.2、認(rèn)真定義并明確公共變量的含義、作用、取值范疇及公共變量間的關(guān)系 40HYPERLINK1.3、明確公共變量與操作此公共變量的函數(shù)或過程的關(guān)系 40HYPERLINK1.4、要謹(jǐn)慎向公共變量傳遞數(shù)據(jù) 40HYPERLINK1.5、避免局部變量與公共變量同名。 40HYPERLINK1.6、公共變量僅由模塊或函數(shù)創(chuàng)立和修改,其它模塊和函數(shù)只能訪問 40HYPERLINK2、局部變量 41HYPERLINK2.1、嚴(yán)禁使用未經(jīng)初始化的變量作為右值 41HYPERLINK2.2、不使用與硬件或軟件環(huán)境關(guān)系親密的變量 41HYPERLINK2.3、變量聲明時,同一類型,不同意義的多個變量,要分行,便于辨別 41HYPERLINK2.4、對只設(shè)立一次的變量,宜使用“const”限定詞進(jìn)行聲明 41HYPERLINK2.5、避免在函數(shù)中使用static局部變量 41HYPERLINK3、數(shù)組 41HYPERLINK3.1、數(shù)組大小及初始值要明擬定義 41HYPERLINK3.2、數(shù)組、構(gòu)造和聯(lián)合的初始化列表應(yīng)顯式描述 41HYPERLINK4、構(gòu)造、聯(lián)合 42HYPERLINK4.1、構(gòu)造的功效要單一,是針對一種事務(wù)的抽象 42HYPERLINK4.2、不要設(shè)計面面俱到、非常靈活的數(shù)據(jù)構(gòu)造 43HYPERLINK4.3、不同構(gòu)造間的關(guān)系不要過于復(fù)雜 43HYPERLINK4.4、構(gòu)造中元素的個數(shù)應(yīng)適中 44HYPERLINK4.5、構(gòu)造體中元素的布局 44HYPERLINK4.6、構(gòu)造體設(shè)計要考慮兼容性 45HYPERLINK4.7、跨平臺數(shù)據(jù)構(gòu)造,要考慮字節(jié)次序及對齊問題 45HYPERLINK4.8、struct或union類型中最少應(yīng)有一種組員 46HYPERLINK4.9、struct或union類型的組員類型 46HYPERLINK5、枚舉 47HYPERLINK5.1、枚舉元素的初始化應(yīng)完整 47HYPERLINK6、自定義數(shù)據(jù)類型 47HYPERLINK6.1、合理地設(shè)計數(shù)據(jù)并使用自定義數(shù)據(jù)類型 47HYPERLINK6.2、自定義數(shù)據(jù)類型命名要恰當(dāng) 47HYPERLINK7、類型轉(zhuǎn)換 47HYPERLINK7.1、謹(jǐn)慎使用數(shù)據(jù)類型的強(qiáng)制轉(zhuǎn)換 47HYPERLINK7.2、理解編譯系統(tǒng)默認(rèn)的數(shù)據(jù)類型轉(zhuǎn)換 47HYPERLINK7.3、應(yīng)嚴(yán)禁signed類型與unsigned類型之間的隱式轉(zhuǎn)化 48HYPERLINK7.4、應(yīng)嚴(yán)禁int類型與float類型的隱式轉(zhuǎn)化 48HYPERLINK8、指針 48HYPERLINK8.1、不應(yīng)對指針變量使用強(qiáng)制類型轉(zhuǎn)換賦值 48HYPERLINK8.2、不應(yīng)把自動類型的局部變量的地址賦值給外部指針 48HYPERLINK8.3、指針的指針不應(yīng)超出兩級 48HYPERLINK8.4、指向不同數(shù)據(jù)類型的指針之間不應(yīng)互相轉(zhuǎn)換 48HYPERLINK8.5、指針轉(zhuǎn)換過程中不應(yīng)丟失指針的const、volatile屬性 48HYPERLINK8.6、只有指向數(shù)組的指針才允許進(jìn)行算術(shù)運(yùn)算 48HYPERLINK8.7、只有指向同一數(shù)組的兩個指針才允許相減 49HYPERLINK8.8、只有指向同一數(shù)組的兩個指針才允許用>、>=、<和<=等關(guān)系運(yùn)算符進(jìn)行比較 49HYPERLINK8.9、指針的索引值不應(yīng)為負(fù) 50HYPERLINK8.10、不應(yīng)對指針值可能為NULL的指針進(jìn)行算術(shù)運(yùn)算 50HYPERLINK8.11、調(diào)用返回類型為指針的函數(shù)后,應(yīng)進(jìn)行與否為空的判斷 50HYPERLINK8.12、局部變量的地址不應(yīng)在本對象消亡后傳給另外一種對象 50HYPERLINK8.13、一種未知大小的對象的指針不應(yīng)成為加法或者減法操作的左操作數(shù) 51HYPERLINK六、函數(shù) 51HYPERLINK1、函數(shù)編寫原則 51HYPERLINK1.1、明確函數(shù)功效,精確(而不是近似)地實(shí)現(xiàn)函數(shù)設(shè)計 51HYPERLINK1.2、函數(shù)的規(guī)模盡量限制在200行以內(nèi) 51HYPERLINK1.3、一種函數(shù)僅完畢一件功效 51HYPERLINK1.4、為簡樸功效編寫函數(shù) 51HYPERLINK1.5、不要設(shè)計多用途面面俱到的函數(shù) 52HYPERLINK1.6、函數(shù)功效含有可預(yù)測性 52HYPERLINK1.7、函數(shù)功效含有獨(dú)立性 52HYPERLINK1.8、避免函數(shù)出現(xiàn)隨機(jī)內(nèi)聚 53HYPERLINK1.9、功效不明確的較小函數(shù),能夠不必存在 54HYPERLINK1.10、設(shè)計高扇入、合理扇出(不大于7)的函數(shù) 54HYPERLINK1.11、減少函數(shù)本身或函數(shù)間的遞歸調(diào)用 54HYPERLINK1.12、減少函數(shù)間的耦合度 54HYPERLINK2、函數(shù)參數(shù) 55HYPERLINK2.1、明確接口函數(shù)參數(shù)的正當(dāng)性檢查者 55HYPERLINK2.2、避免將函數(shù)的參數(shù)作為工作變量 55HYPERLINK2.3、避免設(shè)計多參數(shù)函數(shù),不使用的參數(shù)從接口中去掉 56HYPERLINK2.4、非調(diào)度函數(shù)應(yīng)減少或避免控制參數(shù),盡量只使用數(shù)據(jù)參數(shù) 56HYPERLINK2.5、檢查函數(shù)全部參數(shù)輸入的有效性 57HYPERLINK2.6、檢查函數(shù)全部非參數(shù)輸入的有效性,如數(shù)據(jù)文獻(xiàn)、公共變量等 57HYPERLINK2.7、調(diào)用函數(shù)時參數(shù)類型要一致 57HYPERLINK2.8、避免使用BOOL參數(shù) 57HYPERLINK2.9、在函數(shù)參數(shù)中不應(yīng)使用static存儲類標(biāo)記符 57HYPERLINK2.10、函數(shù)參數(shù)數(shù)量 57HYPERLINK2.11、宜避免函數(shù)參數(shù)在調(diào)用中未被使用 57HYPERLINK3、函數(shù)返回 58HYPERLINK3.1、對所調(diào)用函數(shù)的錯誤返回碼要認(rèn)真、全方面地解決 58HYPERLINK3.2、函數(shù)的返回值要清晰、明了,讓使用者不容易無視錯誤狀況 58HYPERLINK3.3、函數(shù)返回值要與賦值變量類型一致 58HYPERLINK3.4、對于提供了返回值的函數(shù),在引用時最佳使用其返回值 58HYPERLINK3.5、函數(shù)只有一種出口 58HYPERLINK4、可重入函數(shù) 58HYPERLINK4.1、可重入函數(shù)使用局部變量 58HYPERLINK4.2、可重入函數(shù)使用全局變量 58HYPERLINK5、函數(shù)模塊劃分 59HYPERLINK5.1、認(rèn)真分析模塊的功效,進(jìn)行函數(shù)的劃分和組織 59HYPERLINK5.2、如果多段代碼重復(fù)做同一件事情,那么在函數(shù)的劃分上可能存在問題 59HYPERLINK5.3、函數(shù)內(nèi)部的代碼構(gòu)造次序 59HYPERLINK6、循環(huán)語句 60HYPERLINK6.1、循環(huán)控制變量的類型應(yīng)為整型 60HYPERLINK6.2、循環(huán)控制變量應(yīng)為局部變量 61HYPERLINK6.3、for循環(huán)控制語句中的3個體現(xiàn)式只應(yīng)和循環(huán)控制有關(guān) 61HYPERLINK6.4、for循環(huán)不適宜只執(zhí)行一次 61HYPERLINK7、判斷語句 61HYPERLINK7.1、不要容易用條件分支去替代邏輯體現(xiàn)式 61HYPERLINK7.2、switch語句中不應(yīng)只包含default語句 61HYPERLINK7.3、全部非空的switchcase子句都應(yīng)以break語句結(jié)束 61HYPERLINK7.4、switch控制體現(xiàn)式不應(yīng)是一種常量或邏輯體現(xiàn)式 61HYPERLINK7.5、每一種switch語句都應(yīng)最少有一種case子句 61HYPERLINK7.6、case體現(xiàn)式的類型應(yīng)與switch控制體現(xiàn)式的類型一致 61HYPERLINK7.7、case體現(xiàn)式的大小不應(yīng)超出switch控制體現(xiàn)式的大小 61HYPERLINK8、賦值語句 62HYPERLINK8.1、盡量不使用條件賦值語句 62HYPERLINK9、其它注意事項(xiàng) 62HYPERLINK9.1、避免函數(shù)中不必要語句,避免程序中的垃圾代碼 62HYPERLINK9.2、在多任務(wù)操作系統(tǒng)的環(huán)境下編程,更要注意函數(shù)可重入性的構(gòu)造 62HYPERLINK9.3、將慣用較長變量用宏替代 62HYPERLINK七、預(yù)解決 62HYPERLINK1、宏 62HYPERLINK1.1、用宏定義體現(xiàn)式時,要使用完備的括號 62HYPERLINK1.2、將宏所定義的多條體現(xiàn)式放在大括號中 63HYPERLINK1.3、使用宏時,不允許參數(shù)發(fā)生變化 63HYPERLINK1.4、函數(shù)類宏調(diào)用時參數(shù)要完整 64HYPERLINK2、條件編譯 64HYPERLINK2.1、預(yù)解決語句“#if”和“#endif”不應(yīng)分散在不同的文獻(xiàn)之中 64HYPERLINK2.2、被包含文獻(xiàn)中的“#else”、“#elseif”、“#endif”不應(yīng)與父文獻(xiàn)中的“#if”匹配 64HYPERLINK2.3、“#if”體現(xiàn)式中使用的宏應(yīng)當(dāng)已經(jīng)被定義,并且“#if”體現(xiàn)式只能包含整型常量 64HYPERLINK2.4、宏如果需要被重定義,應(yīng)當(dāng)先用“#undef”解除前面的定義 64HYPERLINK八、中斷 64HYPERLINK1、中斷服務(wù)程序不應(yīng)有返回值 64HYPERLINK2、中斷服務(wù)程序中不應(yīng)使用printf()函數(shù) 64HYPERLINK3、對于中斷中使用到的非局部變量,在中斷解決函數(shù)中應(yīng)對其進(jìn)行入棧保護(hù) 64HYPERLINK4、調(diào)用中斷解決程序中的變量要進(jìn)行開關(guān)中斷解決 64HYPERLINK5、對于開關(guān)中斷,要注意成對匹配 64HYPERLINK6、中斷服務(wù)程序代碼要簡樸化 65HYPERLINK九、程序可測性 65HYPERLINK1、原則 65HYPERLINK1.1、統(tǒng)一的調(diào)測開關(guān)及打印函數(shù) 65HYPERLINK1.2、統(tǒng)一的打印信息串格式 65HYPERLINK1.3、正式軟件產(chǎn)品中應(yīng)把斷言及其它調(diào)測代碼去掉(即把有關(guān)的調(diào)測開關(guān)關(guān)掉) 65HYPERLINK1.4、用調(diào)測開關(guān)切換軟件的DEBUG版和正式版 65HYPERLINK1.5、軟件DEBUG版和發(fā)行版在實(shí)現(xiàn)功效上含有一致性 65HYPERLINK1.6、構(gòu)造測試環(huán)境和測試用例 65HYPERLINK1.7、預(yù)先設(shè)計程序調(diào)測的辦法和手段及多個調(diào)測開關(guān) 65HYPERLINK1.8、調(diào)測開關(guān)應(yīng)分為不同級別和類型 66HYPERLINK2、斷言 66HYPERLINK2.1、使用斷言來發(fā)現(xiàn)軟件問題,提高代碼可測性 66HYPERLINK2.2、用斷言來檢查程序正常運(yùn)行時不應(yīng)發(fā)生但在調(diào)測時有可能發(fā)生的非法狀況 67HYPERLINK2.3、不能用斷言來檢查最后產(chǎn)品必定會出現(xiàn)且必須解決的錯誤狀況 67HYPERLINK2.4、對較復(fù)雜的斷言加上明確的注釋 67HYPERLINK2.5、用斷言確認(rèn)函數(shù)的參數(shù) 67HYPERLINK2.6、用斷言確保沒有定義的特性或功效不被使用 67HYPERLINK2.7、用斷言對程序開發(fā)環(huán)境(OS/Compiler/Hardware)的假設(shè)進(jìn)行檢查 68HYPERLINK2.8、編寫防錯程序,然后在解決錯誤之后可用斷言宣布發(fā)生錯誤 68HYPERLINK十、程序效率 69HYPERLINK1、原則 69HYPERLINK1.1、編程時要經(jīng)常注意代碼的效率 69HYPERLINK1.2、提高代碼效率的前提 69HYPERLINK1.3、局部效率應(yīng)為全局效率服務(wù) 69HYPERLINK1.4、合理劃分模塊函數(shù) 69HYPERLINK1.5、不應(yīng)花過多的時間拼命地提高調(diào)用不很頻繁的函數(shù)代碼效率 70HYPERLINK1.6、不要一味追求緊湊的代碼 70HYPERLINK1.7、不應(yīng)存在執(zhí)行不到的代碼 70HYPERLINK1.8、去掉沒必要的全局變量 70HYPERLINK2、辦法 70HYPERLINK2.1、解決軟件空間效率1 70HYPERLINK2.2、解決軟件空間效率2 71HYPERLINK2.3、循環(huán)體內(nèi)工作量最小化 71HYPERLINK2.4、認(rèn)真分析有關(guān)算法,并進(jìn)行優(yōu)化 72HYPERLINK2.5、認(rèn)真考察、分析系統(tǒng)及模塊解決輸入(如事務(wù)、消息等)的方式,并加以改善 72HYPERLINK2.6、直接用匯編編寫調(diào)用頻繁或性能規(guī)定極高的函數(shù) 72HYPERLINK2.7、在多重循環(huán)中,應(yīng)將最忙的循環(huán)放在最內(nèi)層 72HYPERLINK2.8、盡量減少循環(huán)嵌套層次 73HYPERLINK2.9、盡量不在循環(huán)體內(nèi)放置判斷語句 73HYPERLINK2.10、盡量用乘法或其它辦法替代除法,特別是浮點(diǎn)運(yùn)算中的除法 74HYPERLINK2.11、應(yīng)注意switch-case語句的使用 74HYPERLINK十一、程序質(zhì)量 74HYPERLINK1、原則 74HYPERLINK1.1、代碼質(zhì)量確保優(yōu)先原則 74HYPERLINK1.2、合理劃分子模塊,提高可移植性和可重用性 75HYPERLINK1.3、提供良好的接口界面 75HYPERLINK1.4、系統(tǒng)含有一定容錯能力 75HYPERLINK2、辦法 75HYPERLINK2.1、認(rèn)真解決程序所能碰到的多個出錯狀況 75HYPERLINK2.2、系統(tǒng)運(yùn)行之初,要初始化有關(guān)變量及運(yùn)行環(huán)境,避免未經(jīng)初始化的變量被引用 75HYPERLINK2.3、系統(tǒng)運(yùn)行之初,要對加載到系統(tǒng)中的數(shù)據(jù)進(jìn)行一致性檢查 75HYPERLINK2.4、嚴(yán)禁隨意更改其它模塊或系統(tǒng)的有關(guān)設(shè)立和配備 75HYPERLINK2.5、不能隨意變化與其它模塊的接口 75HYPERLINK2.6、避免內(nèi)存操作越界 75HYPERLINK2.7、編程時,要避免差1錯誤 76HYPERLINK2.8、要時刻注意易混淆的操作符 76HYPERLINK2.9、條件判斷語句必須解決全部狀況 76HYPERLINK2.10、不要用goto語句 77HYPERLINK2.11、盡量都采用原則語句和原則庫函數(shù) 77HYPERLINK2.12、避免使用嵌入式匯編 77HYPERLINK2.13、精心構(gòu)造算法,并對其性能、效率進(jìn)行測試 77HYPERLINK2.14、對較核心的算法最佳使用其它算法來確認(rèn) 77HYPERLINK2.15、時刻注意體現(xiàn)式與否會上溢、下溢 77HYPERLINK2.16、使用變量時要注意其邊界值的狀況 77HYPERLINK2.17、注意程序代碼與否超出系統(tǒng)有關(guān)限制 78HYPERLINK2.18、循環(huán)、分支層次不要超出五層 78HYPERLINK2.19、不要比較浮點(diǎn)數(shù)的相等 78HYPERLINK2.20、關(guān)注共用體的存儲、對齊模式 78HYPERLINK2.21、頭文獻(xiàn)中不應(yīng)有對象或函數(shù)的定義 78HYPERLINK2.22、不應(yīng)單獨(dú)使用小寫字母“l(fā)”或大寫字母“O”作為變量名 78HYPERLINK2.23、函數(shù)聲明時參數(shù)不應(yīng)只有類型名沒有標(biāo)記符 78HYPERLINK2.24、不應(yīng)對有符號數(shù)進(jìn)行位運(yùn)算 78HYPERLINK2.25、無格式的字符型不應(yīng)與負(fù)數(shù)常量和零比較 78HYPERLINK2.26、無符號值不應(yīng)與負(fù)數(shù)常量比較 79HYPERLINK2.27、對變量進(jìn)行移位操作應(yīng)確保不會產(chǎn)生溢出和數(shù)據(jù)截短 79HYPERLINK2.28、不應(yīng)在布爾體現(xiàn)式中使用賦值操作符 79HYPERLINK2.29、不應(yīng)對布爾體現(xiàn)式進(jìn)行算術(shù)或者位運(yùn)算 79HYPERLINK2.30、體現(xiàn)式的值在任何求值次序下應(yīng)保持一致 79HYPERLINK2.31、應(yīng)避免去數(shù)可能為0的狀況出現(xiàn) 79HYPERLINK2.32、賦值運(yùn)算符的左操作數(shù)不應(yīng)進(jìn)行轉(zhuǎn)換操作,并且應(yīng)當(dāng)是一種可更改的對象 79HYPERLINK2.33、sizeof操作符不應(yīng)用在有單邊作用的體現(xiàn)式上 79HYPERLINK2.34、留心具體語言及編譯器解決不同數(shù)據(jù)類型的原則及有關(guān)細(xì)節(jié) 80HYPERLINK十二、代碼代碼編輯、編譯、審查 80HYPERLINK1、打開編譯器的全部告警開關(guān)對程序進(jìn)行編譯 80HYPERLINK2、在產(chǎn)品軟件(項(xiàng)目組)中,要統(tǒng)一編譯開關(guān)選項(xiàng) 80HYPERLINK3、通過代碼走讀及審查方式對代碼進(jìn)行檢查 80HYPERLINK4、測試部測試產(chǎn)品之前,應(yīng)對代碼進(jìn)行抽查及評審 80HYPERLINK5、養(yǎng)成隨時保存編寫代碼的習(xí)慣 80HYPERLINK6、同產(chǎn)品軟件(項(xiàng)目組)內(nèi),最佳使用相似的編輯器,并使用相似的設(shè)立選項(xiàng) 80HYPERLINK7、要小心地使用編輯器提供的塊拷貝功效編程 80HYPERLINK8、合理地設(shè)計軟件系統(tǒng)目錄,方便開發(fā)人員使用 80HYPERLINK附錄A慣用數(shù)據(jù)類型及簡寫 81HYPERLINK附錄B慣用單詞及縮寫 82HYPERLINK附錄C常見反義詞組 84HYPERLINK附錄D常見命名規(guī)則 86HYPERLINK一、匈牙利命名法 86HYPERLINK二、駱駝(Camel)命名法 86HYPERLINK三、帕斯卡(Pascal)命名法 86四、下劃線命名法 86第一章、項(xiàng)目模塊劃分一、模塊劃分將整個項(xiàng)目按照功效進(jìn)行模塊劃分,各個模塊互相獨(dú)立,每個模塊由一系列c文獻(xiàn)和h文獻(xiàn)構(gòu)成。簡樸功效的模塊采用一種c文獻(xiàn)和h文獻(xiàn)接口,復(fù)雜功效的模塊可能需要多個c文獻(xiàn)和h文獻(xiàn)。二、模塊命名按照模塊所實(shí)現(xiàn)功效的英文名稱或者簡寫命名,全部采用小寫字母,多于1個單詞的中間加下劃線。例如:模塊命名闡明液晶lcd.clcd.h液晶初始化,字符、中文和圖片顯示lcd_fonts.clcd_fonts.h液晶自定義字庫按鍵key.ckey.h按鍵初始化,鍵值列表,取按鍵值批示燈led.cled.h批示燈初始化,閃爍控制數(shù)碼管ledseg.cledseg.h數(shù)碼管初始化,數(shù)字顯示,特殊字符顯示蜂鳴器beep.cbeep.h蜂鳴器初始化,鳴叫控制第二章、文獻(xiàn)格式一、c文獻(xiàn)格式闡明:1、文獻(xiàn)創(chuàng)立及修改闡明區(qū)重要包含:公司信息:公司名稱、公司網(wǎng)站。創(chuàng)立信息:創(chuàng)立者名稱,創(chuàng)立日期,最初版本號,文檔內(nèi)容描述。修改信息:修改者名稱,修改日期,修改后版本號,修改內(nèi)容描述。可參考模塊《template.c》闡明:與硬件有關(guān)的文獻(xiàn)能夠在此增加闡明,如芯片型號等。2、頭文獻(xiàn)引用區(qū)重要包含:系統(tǒng)頭文獻(xiàn)引用:文獻(xiàn)名包含在尖括號中。自定義頭文獻(xiàn)引用:文獻(xiàn)名包含著雙引號中。可參考模塊《template.c》3、全局變量定義區(qū)重要包含:全局變量定義區(qū)闡明注釋行:全局變量定義:要賦初值。全局變量注釋:可參考模塊《template.c》。4、驅(qū)動函數(shù)區(qū)重要包含:驅(qū)動函數(shù)區(qū)闡明注釋行:函數(shù)闡明:包含函數(shù)闡明,參數(shù)闡明,返回值闡明。函數(shù)體:可參考模塊《template.c》5、應(yīng)用函數(shù)區(qū)重要包含:應(yīng)用函數(shù)區(qū)闡明注釋行:函數(shù)闡明:包含函數(shù)功效闡明,參數(shù)闡明,返回值闡明。函數(shù)體:可參考模塊《template.c》6、文獻(xiàn)結(jié)束闡明重要包含:文獻(xiàn)結(jié)束闡明:EndOfFile可參考模塊《template.c》二、h文獻(xiàn)格式闡明1、文獻(xiàn)創(chuàng)立及修改闡明區(qū)重要包含:公司信息:公司名稱、公司網(wǎng)站。創(chuàng)立信息:創(chuàng)立者名稱,創(chuàng)立日期,最初版本號,文檔內(nèi)容描述。修改信息:修改者名稱,修改日期,修改后版本號,修改內(nèi)容描述。可參考模塊《template.h》2、防重調(diào)用定義命名規(guī)則:下劃線+文獻(xiàn)名大寫+下劃線+文獻(xiàn)類型H+下劃線可參考模塊《template.h》3、頭文獻(xiàn)引用重要包含:系統(tǒng)頭文獻(xiàn)引用:文獻(xiàn)名包含在尖括號中。自定義頭文獻(xiàn)引用:文獻(xiàn)名包含著雙引號中。可參考模塊《template.h》4、控制接口定義區(qū)重要包含:控制口線定義區(qū)闡明注釋行:接口定義:全部采用大寫字母,單詞間下列劃線分割注釋闡明:可參考模塊《template.h》5、常量定義區(qū)重要包含:常量定義區(qū)闡明注釋行:常量定義:全部采用大寫字母,單詞間下列劃線分割注釋闡明:可參考模塊《template.h》6、宏調(diào)用定義區(qū)重要包含:宏調(diào)用定義區(qū)闡明注釋行:宏調(diào)用解決:注釋闡明:可參考模塊《template.h》7、類型定義區(qū)重要包含:類型定義區(qū)闡明注釋行:類型定義:注釋闡明:構(gòu)造體組員要單獨(dú)闡明。可參考模塊《template.h》8、外部引用變量區(qū)重要包含:外部應(yīng)用變量區(qū)闡明注釋行:引用變量聲明:以extern核心字開始注釋闡明:可參考模塊《template.h》9、外部引用函數(shù)區(qū)重要包含:外部應(yīng)用函數(shù)區(qū)闡明注釋行:函數(shù)注釋闡明:包含函數(shù)功效闡明,參數(shù)闡明,返回值闡明引用函數(shù)聲明:以extern核心字開始可參考模塊《template.h》10、操作流程闡明區(qū)重要包含:操作流程闡明區(qū)闡明注釋行:模塊執(zhí)行流程闡明:闡明要具體,執(zhí)行環(huán)節(jié)要明確。可參考模塊《template.h》11、文獻(xiàn)結(jié)束闡明重要包含:文獻(xiàn)結(jié)束闡明:EndOfFile可參考模塊《template.h》第三章、命名規(guī)則一、函數(shù)命名規(guī)則格式以下:序號闡明字體選擇備注1模塊名稱大寫必選以最直觀模式給顧客辨別不同的模塊函數(shù),采用模塊英文名稱或者簡寫2下劃線必選間隔符3函數(shù)動作首字母大寫必選動作英文名稱或者簡寫,最多2個單詞4函數(shù)對象首字母大寫可選對象英文名稱或者簡寫,最多2個單詞5函數(shù)范疇首字母大寫可選范疇英文名稱或者簡寫,最多2個單詞例如:LCD_DispWord,表達(dá)液晶模塊顯示中文函數(shù)命名的一種重要原則是望文知意(其別人看到函數(shù)名就大致懂得函數(shù)功效),必須考慮命名的精確性,命名體現(xiàn)函數(shù)的功效,而不要體現(xiàn)函數(shù)的實(shí)現(xiàn)辦法。二、變量命名規(guī)則局部變量命名:格式以下:序號闡明字體選擇備注1變量類型簡寫小寫必選以最直觀模式給顧客辨別不同的變量類型,最多2個字母長度,具體參考《附錄A慣用變量類型及簡寫》2變量修飾首字母大寫可選修飾詞英文名稱或者簡寫,最多2個單詞3變量名稱首字母大寫必選名稱英文名稱或者簡寫,最多2個單詞例如:ucharucCurrentValue;表達(dá)無符號類型,現(xiàn)在值數(shù)組變量命名時在局部變量類型前增加前綴字母“a”。例如:ucharaucSendBuff[10];指針變量命名時在局部變量類型前增加前綴字母“p”。例如:uchar*pucReceiveBuff[10];全局變量命名時在局部變量類型前增加前綴字母“g”和下劃線。靜態(tài)變量命名時在局部變量類型前增加前綴字母“s”和下劃線。三、宏命名規(guī)則格式以下:序號闡明字體選擇備注1模塊名稱大寫必選以最直觀模式給顧客辨別不同的模塊宏,采用模塊英文名稱或者簡寫2下劃線必選間隔符3功效名稱大寫必選功效英文名稱或者簡寫,最多2個單詞4下劃線可選間隔符5修飾詞大寫可選修飾詞英文名稱或者簡寫,最多2個單詞例如:#defineTMP_BUFF_MAX 256 //緩沖區(qū)最大長度四、文獻(xiàn)命名規(guī)則格式以下(全部小寫):序號闡明字體選擇備注1模塊名稱小寫必選采用模塊英文名稱或者簡寫2下劃線可選_3分類名稱小寫可選分類英文名稱或者簡寫4頓號必選.5文獻(xiàn)類型小寫必選代碼文獻(xiàn)(c),頭文獻(xiàn)(h)例如:液晶模塊:lcd_driver.clcd_driver.hlcd_fonts.clcd_fonts.h按鍵模塊:key.ckey.h五、新定義變量類型命名規(guī)則新定義變量類型對變量進(jìn)行命名時能夠提出2個與其它類型不相似的字母前綴來表達(dá),并在文獻(xiàn)開始或者新類型定義時進(jìn)行闡明。六、命名注意事項(xiàng):1、標(biāo)記符命名基本原則標(biāo)記符的命名要清晰、明了,有明確含義,同時使用完整的單詞或大家基本能夠理解的縮寫,避免使人產(chǎn)生誤解。盡量采用英文命名,不能夠用漢語拼音。標(biāo)記符的長度應(yīng)當(dāng)符合“min-length&&max-information”原則。闡明:較短的單詞可通過去掉“元音”形成縮寫;較長的單詞可取單詞的頭幾個字母形成縮寫;某些單詞有大家公認(rèn)的縮寫。參考《附錄B慣用單詞及縮寫》2、命名中若使用特殊商定或縮寫,則要有注釋闡明闡明:應(yīng)當(dāng)在源文獻(xiàn)的開始之處,對文獻(xiàn)中所使用的縮寫或商定,特別是特殊的縮寫,進(jìn)行必要的注釋闡明。3、局部循環(huán)變量也必須按照變量命名規(guī)則來定義闡明:變量,特別是局部變量,如果用單個字符表達(dá),很容易敲錯(如i寫成j),而編譯時又檢查不出來,有可能為了這個小小的錯誤而耗費(fèi)大量的查錯時間。4、不要用數(shù)字或較奇怪的字符來定義標(biāo)記符示例:以下命名,使人產(chǎn)生疑惑。#defineEXAMPLE_0_TEST#defineEXAMPLE_1_TESTvoidTMP_SetSls00(ucharucSls);應(yīng)改為故意義的單詞命名#defineEXAMPLE_UNIT_TEST#defineEXAMPLE_ASSERT_TESTvoidTMP_SetUdtMsgSls(ucharucSls);5、用對的的反義詞組命名含有互斥意義的變量或相反動作的函數(shù)等闡明:可參考《附錄C常見反義詞組》下面是某些在軟件中慣用的反義詞組。示例:uintuiMinSum;uintuiMaxSum;uintTMP_AddUser(uchar*pucUserName);uintTMP_DeleteUser(uchar*pucUserName);6、避免使用下列劃線開始和結(jié)尾的定義除了編譯開關(guān)/頭文獻(xiàn)等特殊應(yīng)用,應(yīng)避免使用_EXAMPLE_TEST_之類下列劃線開始和結(jié)尾的定義7、程序中不要出現(xiàn)僅靠大小寫辨別的相似的標(biāo)記符例如:uintuix,uiX;//變量x與X容易混淆voidTMP_foo(uintuiX);//函數(shù)foo與FOO容易混淆voidTMP_FOO(floatfX);8、標(biāo)記符縮寫命名時盡量不使用單詞縮寫,如果單詞太長必須縮寫,應(yīng)當(dāng)省略其中的元音字母,方便望文知意,如packet_header縮寫為pkt_hdr,而不要縮寫為pack_h。慣用單詞縮寫見《附錄B慣用單詞及縮寫》9、函數(shù)名應(yīng)精確描述函數(shù)的功效10、避免使用無意義或含義不清的動詞為函數(shù)命名闡明:避免用含義不清的動詞如process、handle等為函數(shù)命名,由于這些動詞并沒有闡明要具體做什么。第四章、代碼書寫規(guī)范一、基本原則制訂規(guī)范的基本目的就是加強(qiáng)代碼的可維護(hù)性,也就是說代碼必須易于閱讀,易于理解,易于測試,易于移植。全部的代碼必須采用ANSIC,原則函數(shù)原型必須采用ANSIC原則。保持代碼語句和構(gòu)造簡樸清晰,避免使用復(fù)雜語句。二、排版1、縮進(jìn)風(fēng)格程序塊要采用縮進(jìn)風(fēng)格編寫,縮進(jìn)的空格數(shù)為4個。預(yù)解決語句、全局?jǐn)?shù)據(jù)、函數(shù)原型、標(biāo)題、附加闡明、函數(shù)闡明、標(biāo)號等均頂格書寫。語句塊的“{”“}”配對對齊,并與其前一行對齊。2、不要使用【TAB】鍵 【TAB】鍵在不同編輯器和打印機(jī)上因所設(shè)立空格數(shù)目不同而造成程序布局不整潔,從而造成代碼縮排混亂。能夠采用空格鍵來替代,4個空格替代一種【TAB】鍵。如果采用SourceInsight軟件,能夠設(shè)立按【TAB】鍵后自動用4個空格鍵替代。3、空行相對獨(dú)立的程序塊之間、變量闡明之后必須加空行。程序文獻(xiàn)構(gòu)造各部分之間空兩行,若不必要也可只空一行,各函數(shù)實(shí)現(xiàn)之間普通空兩行示例:以下例子不符合規(guī)范。if((ucCount==1)&&(ucRetCode==1)){if(ucStatus=='1'){*pucErrCode=0;returnEPRONTCENTER;}}if((ucCount==1)&&(ucRetCode==0)){*pucErrCode=EPRONTCENTER;returnEPRONTCENTER;}應(yīng)以下書寫:if((ucCount==1)&&(ucRetCode==1)){if(ucStatus=='1'){*pucErrCode=0;returnEPRONTCENTER;}}if((ucCount==1)&&(ucRetCode==0)){*pucErrCode=EPRONTCENTER;returnEPRONTCENTER;}4、語句長度要不大于80個字符一行語句以不大于80字符為宜,不要寫得過長。過多的代碼會造成顯示屏顯示局限性,從而減少代碼閱讀速度,代碼打印時也會造成打印局限性5、長語句換行較長的語句(>80字符)要分成多行書寫,長體現(xiàn)式要在低優(yōu)先級操作符處劃分新行,操作符放在新行之首,劃分出的新行要進(jìn)行合適的縮進(jìn),使排版整潔,語句可讀。 示例:stPermCountMsg.ucHead.ucLen=TMP_TO_STAT_PERM_COUNT_LEN+TMP_STAT_SIZE_PER_FRAM*sizeof(ulong);aucTaskTable[ucFrameId*TMP_STAT_TASK_CHECK_NUMBER+ucIndex]=astAtPoi[ucIndex].ucStatus;6、長體現(xiàn)式換行循環(huán)、判斷等語句中若有較長的體現(xiàn)式或語句,則要進(jìn)行適應(yīng)的劃分,長體現(xiàn)式要在低優(yōu)先級操作符處劃分新行,操作符放在新行之首。劃分出的新行要進(jìn)行合適的縮進(jìn),使排版整潔,語句可讀。示例:if((ucTaskNo<TMP_MAX_TASK_NUMBER)&&(TMP_StatItemValid(ucStatItem))){...//programcode}for(i=0,j=0;(i<astBufferKeyword[ucWordIndex].ucWordLength)&&(j<stNewKeyword.ucWordLength);i++,j++){...//programcode}for(i=0,j=0;(i<usFirstWordLength)&&(j<ucSecondWordLength);i++,j++){...//programcode}7、若函數(shù)的參數(shù)較長,則要進(jìn)行合適的劃分8、一行只寫一條語句不允許把多個短語句寫在一行中,即一行只寫一條語句示例:以下例子不符合規(guī)范。stRect.ucLength=0;stRect.ucWidth=0;應(yīng)以下書寫stRect.ucLength=0;stRect.ucWidth=0;9、括號{}if、for、do、while、case、switch、default等語句自占一行,且if、for、do、while等語句的執(zhí)行語句部分無論多少都要加括號{}。左大括號“{”后和右大括號“}”前不可出當(dāng)代碼,并且與引用他的語句左對齊。示例:以下例子不符合規(guī)范。if(pUserCR==NULL)return;應(yīng)以下書寫:if(pUserCR==NULL){return;}10、語句縮進(jìn)規(guī)定函數(shù)的開始、構(gòu)造的定義及循環(huán)、判斷等語句中的代碼都要采用縮進(jìn)風(fēng)格,case語句下的狀況解決語句也要遵從語句縮進(jìn)規(guī)定。預(yù)解決指令不需要縮進(jìn),總是從行首開始。即使預(yù)解決指令位于縮進(jìn)代碼塊中,指令也應(yīng)從行首開始示例:良好風(fēng)格:預(yù)解決指令均從行首開始if(lopsided_score){#ifDISASTER_PENDING//Correct--StartsatbeginningoflineDropEverything();#ifNOTIFYNotifyClient();#endif#endifBackToNormal();}不良風(fēng)格:縮進(jìn)的預(yù)解決指令if(lopsided_score){#ifDISASTER_PENDING//Wrong!The"#if"shouldbeatbeginning//oflineDropEverything();#endif//Wrong!Donotindent"#endif"BackToNormal();}11、分界符程序塊的分界符(如C/C++語言的大括號‘{’和‘}’)應(yīng)各獨(dú)占一行并且位于同一列,同時與引用它們的語句左對齊。在函數(shù)體的開始、類的定義、構(gòu)造的定義、枚舉的定義以及if、for、do、while、switch、case語句中的程序都要采用如上的縮進(jìn)方式。示例:以下例子不符合規(guī)范。for(...){...//programcode}if(...){...//programcode}voidexample_fun(void){...//programcode}應(yīng)以下書寫。for(...){...//programcode}if(...){...//programcode}voidexample_fun(void){...//programcode}12、空格在兩個以上的核心字、變量、常量進(jìn)行對等操作時,它們之間的操作符之前、之后或者前后要加空格;進(jìn)行非對等操作時,如果是關(guān)系親密的操作符(一元操作符,組員操作符,數(shù)組下標(biāo))后不應(yīng)加空格。闡明:采用這種松散方式編寫代碼的目的是使代碼更加清晰。由于留空格所產(chǎn)生的清晰性是相對的,因此,在已經(jīng)非常清晰的語句中沒有必要再留空格,如果語句已足夠清晰則括號內(nèi)側(cè)(即左括號背面和右括號前面)不需要加空格,多重括號間不必加空格,由于在C/C++語言中括號已經(jīng)是最清晰的標(biāo)志了。在長語句中,如果需要加的空格非常多,那么應(yīng)當(dāng)保持整體清晰,而在局部不加空格。給操作符留空格時不要持續(xù)留兩個以上空格。(1)、核心字之后要留空格,以突出核心字。(2)、函數(shù)名之后不要留空格,緊跟左括號‘(’,以與核心字區(qū)別(3)、‘(’向后緊跟,‘)’、‘,’、‘;’向前緊跟,緊跟處不留空格。(4)、‘,’之后要留空格,例如:Function(x,y,z)。(5)、如果‘;’不是一行的結(jié)束符號,其后要留空格例如:for(initialization;condition;update)(6)、賦值操作符、比較操作符、算術(shù)操作符、邏輯操作符、位域操作符,如“=”、“+=”“>=”、“<=”、“+”、“*”、“%”、“&&”、“||”、“<<”,“^”等二元操作符的前后應(yīng)當(dāng)加一種空格。if(current_time>=MAX_TIME_VALUE)a=b+c;a*=2;a=b^2;(7)、"!"、"~"、"++"、"--"、"&"(地址運(yùn)算符)等單目操作符前后不加空格。*p='a';//內(nèi)容操作"*"與內(nèi)容之間flag=!isEmpty;//非操作"!"與內(nèi)容之間p=&mem;//地址操作"&"與內(nèi)容之間i++; //"++","--"與內(nèi)容之間(8)、”[]”、"->"、"."前后不加空格。p->id=pid;//"->"指針前后不加空格(9)、指針定義符號*的前面加空格。char*get_string(){char*str;}(10)、對于體現(xiàn)式比較長的for語句和if語句,為了緊湊起見能夠合適地去掉某些空格例如:for(i=0;i<10;i++)和if((a<=b)&&(c<=d))三、注釋1、注釋量普通狀況下,源程序有效注釋量必須在20%以上。闡明:注釋的原則是有助于對程序的閱讀理解,注釋不適宜太多也不能太少,注釋語言必須精確、易懂、簡潔。 2、函數(shù)頭部注釋每個函數(shù)頭部都應(yīng)當(dāng)進(jìn)行注釋,涉及函數(shù)實(shí)現(xiàn)的功效,參數(shù)闡明,返回值等。函數(shù)的頭部注釋要達(dá)成調(diào)用無需瀏覽函數(shù),從注釋區(qū)就能夠理解該函數(shù)的全部信息。函數(shù)功效:該函數(shù)實(shí)現(xiàn)的具體功效,含有依賴關(guān)系的函數(shù)間在此進(jìn)行闡明。參數(shù):如果參數(shù)值為已知,能夠在此具體列表闡明。如果函數(shù)有調(diào)用全局變量,也要在此進(jìn)行具體闡明。返回:函數(shù)返回值,對不同的返回值要進(jìn)行具體闡明。3、代碼與注釋同時修改邊寫代碼邊注釋,修改代碼同時修改對應(yīng)的注釋,以確保注釋與代碼的一致性。不再有用的注釋要刪除。4、注釋的內(nèi)容要清晰、明了,含義精確,避免注釋二義性闡明:錯誤的注釋不僅無益反而有害。5、避免在注釋中使用縮寫,特別是非慣用縮寫闡明:在使用縮寫時或之前,應(yīng)對縮寫進(jìn)行必要的闡明。6、注釋書寫位置注釋應(yīng)與其描述的代碼相近,對代碼的注釋應(yīng)放在其上方或右方(對單條語句的注釋)相鄰位置,不可放在下面,如放于上方則需與其上面的代碼用空行隔開。示例:以下例子不符合規(guī)范。例1://getreplicatesubsystemindexandnetindicatorucRepssnInd=aucSsnData[ucIndex].ucRepssnIndex;ucRepssnNi=aucSsnData[ucIndex].ucNi;例2:ucRepssnInd=aucSsnData[ucIndex].ucRepssnIndex;ucRepssnNi=aucSsnData[ucIndex].ucNi;//getreplicatesubsystemindexandnetindicator應(yīng)以下書寫//getreplicatesubsystemindexandnetindicatorucRepssnInd=aucSsnData[ucIndex].ucRepssnIndex;ucRepssnNi=aucSsnData[ucIndex].ucNi;7、變量、常量命名不能充足自注釋的,必須加以注釋對于全部有物理含義的變量、常量,如果其命名不是充足自注釋的,在聲明時都必加注釋,闡明其物理含義。變量、常量、宏的注釋應(yīng)放在其上方相鄰位置或右方。示例://activestatistictasknumber#defineMAX_ACT_TASK_NUMBER1000#defineMAX_ACT_TASK_NUMBER1000//activestatistictasknumber8、數(shù)據(jù)構(gòu)造命名不能充足自注釋的,必須加以注釋數(shù)據(jù)構(gòu)造聲明(涉及數(shù)組、構(gòu)造、類、枚舉等),如果其命名不是充足自注釋的,必須加以注釋。對數(shù)據(jù)構(gòu)造的注釋應(yīng)放在其上方相鄰位置,不可放在下面;對構(gòu)造中的每個域的注釋放在此域的右方。示例:可按以下形式闡明枚舉/數(shù)據(jù)/聯(lián)合構(gòu)造。//sccpinterfacewithsccpuserprimitivemessagenameenumSCCP_USER_PRIMITIVE{N_UNITDATA_IND,//sccpnotifysccpuserunitdatacomeN_NOTICE_IND,//sccpnotifyusertheNo.7networkcannot//transmissionthismessageN_UNITDATA_REQ,//sccpuser'sunitdatatransmissionrequest};9、全局變量注釋全局變量要有較具體的注釋,涉及對其功效、取值范疇、以及存取時注意事項(xiàng)等的闡明。10、注釋要與說描述的內(nèi)容進(jìn)行同樣的縮排闡明:可使程序排版整潔,并方便注釋的閱讀與理解。示例:以下例子,排版不整潔,閱讀稍感不方便。voidexample_fun(void){//codeonecommentsCodeBlockOne//codetwocommentsCodeBlockTwo}應(yīng)改為以下布局。voidexample_fun(void){//codeonecommentsCodeBlockOne//codetwocommentsCodeBlockTwo}11、將注釋與其上面的代碼用空行隔開示例:以下例子,顯得代碼過于緊湊。//codeonecomments*/programcodeone//codetwocommentsprogramcodetwo應(yīng)以下書寫://codeonecommentsprogramcodeone//codetwocommentsprogramcodetwo12、持續(xù)case語句解決時,必須編寫注釋對于switch語句下的case語句,如果由于特殊狀況需要解決完一種case后進(jìn)入下一種case解決,必須在該case語句解決完、下一種case語句前加上明確的注釋。闡明:這樣比較清晰程序編寫者的意圖,有效避免無端遺漏break語句。示例(注意斜體加粗部分):caseCMD_UP:ProcessUp();break;caseCMD_DOWN:ProcessDown();break;caseCMD_FWD:ProcessFwd();if(...){...break;}else{ProcessCFW_B();//nowjumpintocaseCMD_A}caseCMD_A:ProcessA();break;caseCMD_B:ProcessB();break;caseCMD_C:ProcessC(); break;caseCMD_D:ProcessD();break;...13、代碼或體現(xiàn)式的中間嚴(yán)禁插入注釋闡明:除非必要,不應(yīng)在代碼或體現(xiàn)中間插入注釋,否則容易使代碼可理解性變差。14、通過對的命名使代碼成為自注釋的通過對函數(shù)或過程、變量、構(gòu)造等對的的命名以及合理地組織代碼的構(gòu)造,使代碼成為自注釋的。闡明:清晰精確的函數(shù)、變量等的命名,可增加代碼可讀性,并減少不必要的注釋15、在代碼的功效、意圖層次上進(jìn)行注釋,提供有用、額外的信息闡明:注釋的目的是解釋代碼的目的、功效和采用的辦法,提供代碼以外的信息,協(xié)助讀者理解代碼,避免沒必要的重復(fù)注釋信息。示例:以下注釋意義不大。//ifreceive_flagisTRUEif(receive_flag)而以下的注釋則給出了額外有用的信息。//ifmtpreceiveamessagefromlinksif(receive_flag)16、在程序塊的結(jié)束行右方加注釋標(biāo)記,以表明某程序塊的結(jié)束闡明:當(dāng)代碼段較長,特別是多重嵌套時,這樣做能夠使代碼更清晰,更便于閱讀。示例:參見以下例子。if(...){//programcode while(index<MAX_INDEX){//programcode}/*endofwhile(index<MAX_INDEX)*///指明該條while語句結(jié)束}/*endofif(...)*///指明是哪條if語句結(jié)束17、注釋格式語句、變量定義、宏定義注釋使用“//……”格式語句塊、函數(shù)闡明使用“/*……*/”格式。18、采用中文注釋注釋應(yīng)考慮程序易讀及外觀排版的因素,使用的語言若是中、英兼有的,建議多使用中文,除非能用非常流利精確的英文體現(xiàn)。闡明:注釋語言不統(tǒng)一,影響程序易讀性和外觀排版,出于對維護(hù)人員的考慮,建議使用中文。19、使用#if0和#endif注釋代碼塊使用#if0和#endif注釋代碼塊。例如:來注釋一段較大的代碼#if0#defineDISP_TBL_SIZE5//Sizeofdisplaybuffertable#defineDISP_MAX_X80//Max.numberofcharactersinXaxis#defineDISP_MAX_Y25//Max.numberofcharactersinYaxis#defineDISP_MASK0x5F#endif20、注釋不能嵌套四、代碼可讀性1、使用小括號明確體現(xiàn)式的操作次序注意運(yùn)算符的優(yōu)先級,并用括號明確體現(xiàn)式的操作次序,避免使用默認(rèn)優(yōu)先級。闡明:避免閱讀程序時產(chǎn)生誤解,避免因默認(rèn)的優(yōu)先級與設(shè)計思想不符而造成程序出錯。示例:下列語句中的體現(xiàn)式word=(high<<8)|low(1)if((a|b)&&(a&c))(2)if((a|b)<(c&d))(3)如果書寫為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)不會出錯,但語句不易理解;a|b<c&d=a|(b<c)&d,(3)造成了判斷條件出錯。2、用故意義的枚舉和宏替代數(shù)字避免使用不易理解的數(shù)字,用故意義的標(biāo)記來替代。涉及物理狀態(tài)或者含有物理意義的常量,不應(yīng)直接使用數(shù)字,必須用故意義的枚舉或宏來替代。示例:以下的程序可讀性差。if(Trunk[index].trunk_state==0){Trunk[index].trunk_state=1;...//programcode}應(yīng)改為以下形式: #defineTRUNK_IDLE0#defineTRUNK_BUSY1if(Trunk[index].trunk_state==TRUNK_IDLE){Trunk[index].trunk_state=TRUNK_BUSY;...//programcode}3、源程序中關(guān)系較為緊密的代碼應(yīng)盡量相鄰闡明:便于程序閱讀和查找。示例:下列代碼布局不太合理。rect.length=10;char_poi=str;rect.width=5;若按以下形式書寫,可能更清晰某些。rect.length=10;rect.width=5;//矩形的長與寬關(guān)系較親密,放在一起。char_poi=str;4、用多行簡樸語句替代復(fù)雜語句不要使用難懂的技巧性很高的語句,除非很有必要時。闡明:高技巧語句不等于高效率的程序,事實(shí)上程序的效率核心在于算法。示例:以下體現(xiàn)式,考慮不周就可能出問題,也較難理解。*stat_poi+++=1;*++stat_poi+=1;應(yīng)分別改為以下。*stat_poi+=1;stat_poi++;//此二語句功效相稱于“*stat_poi+++=1;”++stat_poi;*stat_poi+=1;//此二語句功效相稱于“*++stat_poi+=1;五、變量,構(gòu)造 1、公共變量1.1、去掉沒必要的公共變量闡明:公共變量是增大模塊間耦合的因素之一,故應(yīng)減少沒必要的公共變量以減少模塊間的耦合度。1.2、認(rèn)真定義并明確公共變量的含義、作用、取值范疇及公共變量間的關(guān)系闡明:在對變量聲明的同時,應(yīng)對其含義、作用及取值范疇進(jìn)行注釋闡明,同時若有必要還應(yīng)闡明與其它變量的關(guān)系。1.3、明確公共變量與操作此公共變量的函數(shù)或過程的關(guān)系 明確公共變量與操作此公共變量的函數(shù)或過程的關(guān)系,如訪問、修改及創(chuàng)立等。闡明:明確過程操作變量的關(guān)系后,將有助于程序的進(jìn)一步優(yōu)化、單元測試、系統(tǒng)聯(lián)調(diào)以及代碼維護(hù)等。這種關(guān)系的闡明可在注釋或文檔中描述。示例:在源文獻(xiàn)中,可按以下注釋形式闡明。RELATIONSystem_InitInput_RecPrint_RecStat_ScoreStudentCreateModifyAccessAccessScoreCreateModifyAccessAccess,Modify注:RELATION為操作關(guān)系;System_Init、Input_Rec、Print_Rec、Stat_Score為四個不同的函數(shù);Student、Score為兩個全局變量;Create表達(dá)創(chuàng)立,Modify表達(dá)修改,Access表達(dá)訪問。其中,函數(shù)Input_Rec、Stat_Score都可修變化量Score,故此變量將引發(fā)函數(shù)間較大的耦合,并可能增加代碼測試、維護(hù)的難度。1.4、要謹(jǐn)慎向公共變量傳遞數(shù)據(jù)當(dāng)向公共變量傳遞數(shù)據(jù)時,要十分小心,避免賦與不合理的值或越界等現(xiàn)象發(fā)生。闡明:對公共變量賦值時,若有必要應(yīng)進(jìn)行正當(dāng)性檢查,以提高代碼的可靠性、穩(wěn)定性。1.5、避免局部變量與公共變量同名。闡明:若使用了較好的命名規(guī)則,那么此問題可自動消除。1.6、公共變量僅由模塊或函數(shù)創(chuàng)立和修改,其它模塊和函數(shù)只能訪問構(gòu)造僅有一種模塊或函數(shù)能夠修改、創(chuàng)立,而其它有關(guān)模塊或函數(shù)只訪問的公共變量,避免多個不同模塊或函數(shù)都能夠修改、創(chuàng)立同一公共變量的現(xiàn)象。闡明:減少公共變量耦合度。2、局部變量2.1、嚴(yán)禁使用未經(jīng)初始化的變量作為右值闡明:特別是在C/C++中引用未經(jīng)賦值的指針,經(jīng)常會引發(fā)系統(tǒng)崩潰。2.2、不使用與硬件或軟件環(huán)境關(guān)系親密的變量使用嚴(yán)格形式定義的、可移植的數(shù)據(jù)類型,盡量不要使用與具體硬件或軟件環(huán)境關(guān)系親密的變量。闡明:使用原則的數(shù)據(jù)類型,有助于程序的移植。2.3、變量聲明時,同一類型,不同意義的多個變量,要分行,便于辨別示例:下列代碼中,i,j,k是臨時循環(huán)變量,與有實(shí)際意義的lenth,width放一起不太合理。intlength,width,i,j,k;若按以下形式書寫,可能更清晰某些。intlength,width;inti,j,k;2.4、對只設(shè)立一次的變量,宜使用“const”限定詞進(jìn)行聲明2.5、避免在函數(shù)中使用static局部變量盡量避免函數(shù)帶有“記憶”功效,相似的輸入應(yīng)當(dāng)產(chǎn)生相似的輸出。帶有“記憶”功效的函數(shù),其行為可能是不可預(yù)測的,由于它的行為可能取決于某種“記憶狀態(tài)”。這樣的函數(shù)既不易理解又不利于測試和維護(hù)。3、數(shù)組3.1、數(shù)組大小及初始值要明擬定義數(shù)組初始化不要采用系統(tǒng)默認(rèn)值,最佳能夠采用初始化語句來完畢3.2、數(shù)組、構(gòu)造和聯(lián)合的初始化列表應(yīng)顯式描述數(shù)組、構(gòu)造和聯(lián)合的初始化列表應(yīng)使用大括號,并使用附加的大括號來批示嵌套的構(gòu)造;程序員應(yīng)顯式地考慮和描述復(fù)雜數(shù)據(jù)類型的全部元素,不應(yīng)無視某個元素的初始化。例如:錯誤使用方法int16_ty[3][2]={1,2,3,4,5,6};int16_ty[3][2]={{1,2}};對的使用方法:int16_ty[3][2]={{1,2},{3,4},{54、構(gòu)造、聯(lián)合4.1、構(gòu)造的功效要單一,是針對一種事務(wù)的抽象闡明:設(shè)計構(gòu)造時應(yīng)力求使構(gòu)造代表一種現(xiàn)實(shí)事務(wù)的抽象,而不是同時代表多個。構(gòu)造中的各元素應(yīng)代表同一事務(wù)的不同側(cè)面,而不應(yīng)把描述沒有關(guān)系或關(guān)系很弱的不同事務(wù)的元素放到同一構(gòu)造中。示例:以下構(gòu)造不太清晰、合理。typedefstructSTUDENT_STRU{unsignedcharaucName[8];//student'snameunsignedcharucAge;//student'sageunsignedcharucSex;//student'ssex,asfollows//0-FEMALE;1-MALEunsignedcharaucTeacherName[8];//thestudentteacher'snameunisgnedcharucTeacherSex;//histeachersex}STUDENT;若改為以下,可能更合理些。typedefstructTEACHER_STRU{unsignedcharaucName[8];//teachernameunisgnedcharucSex;//teachersex,asfollows//0-FEMALE;1-MALE}TEACHER;typedefstructSTUDENT_STRU{unsignedcharaucName[8];//student'snameunsignedcharucAge;//student'sageunsignedcharucSex;//student'ssex,asfollows//0-FEMALE;1-MALEunsignedintucTeacherInd;//histeacherindex}STUDENT;4.2、不要設(shè)計面面俱到、非常靈活的數(shù)據(jù)構(gòu)造闡明:面面俱到、靈活的數(shù)據(jù)構(gòu)造反而容易引發(fā)誤解和操作困難。4.3、不同構(gòu)造間的關(guān)系不要過于復(fù)雜闡明:若兩個構(gòu)造間關(guān)系較復(fù)雜、親密,那么應(yīng)合為一種構(gòu)造。示例:以下兩個構(gòu)造的構(gòu)造不合理。typedefstructPERSON_ONE_STRU{unsignedcharaucName[8];unsignedcharaucAddr[40];unsignedcharucSex;unsignedcharucCity[15];}PERSON_ONE;typedefstructPERSON_TWO_STRU{unsignedcharaucName[8];unsignedcharucAge;unsignedcharucTel;}PERSON_TWO;由于兩個構(gòu)造都是描述同一事物的,那么不如合成一種構(gòu)造。typedefstructPERSON_STRU{unsignedcharaucName[8];unsignedcharucAge;unsignedcharucSex;unsignedcharaucAddr[40];unsignedcharaucCity[15];unsignedcharucTel;}PERSON;4.4、構(gòu)造中元素的個數(shù)應(yīng)適中若構(gòu)造中元素個數(shù)過多可考慮根據(jù)某種原則把元素構(gòu)成不同的子構(gòu)造,以減少原構(gòu)造中元素的個數(shù)。闡明:增加構(gòu)造的可理解性、可操作性和可維護(hù)性。示例:如果認(rèn)為如上的_PERSON構(gòu)造元素過多,那么能夠下對之劃分。typedefstructPERSON_BASE_INFO_STRU{unsignedcharucName[8];unsignedcharucAge;unsignedcharucSex;}PERSON_BASE_INFO;typedefstructPERSON_ADDRESS_STRU{unsignedcharucAddr[40];
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025簽訂購房合同注意事項(xiàng)全面解析
- 人力資源服務(wù)平臺合同樣本
- 2025年秘魯瑪卡項(xiàng)目發(fā)展計劃
- 房屋拆遷合同模板
- 擔(dān)保公司四方借款合同
- 付款三方協(xié)議建筑合同樣本
- 保修協(xié)議書范例
- 二零二五版勘探服務(wù)合同
- 教師聘任合同二零二五年
- 車輛展廳出租合同范例
- 19S406建筑排水管道安裝-塑料管道
- KA-T 20.1-2024 非煤礦山建設(shè)項(xiàng)目安全設(shè)施設(shè)計編寫提綱 第1部分:金屬非金屬地下礦山建設(shè)項(xiàng)目安全設(shè)施設(shè)計編寫提綱
- 綠色生活實(shí)踐
- (2024年)硫化氫安全培訓(xùn)課件
- 《聚焦超聲治療》課件
- 2023-2024學(xué)年高一下學(xué)期第一次月考(湘教版2019)地理試題(解析版)
- 婦科炎癥介紹演示培訓(xùn)課件
- 如康家園管理制度
- 蓄水池工程施工工藝與技術(shù)措施
- 2022年4月自考00149國際貿(mào)易理論與實(shí)務(wù)試題及答案含評分標(biāo)準(zhǔn)
- 大數(shù)據(jù)驅(qū)動的藥物研發(fā)
評論
0/150
提交評論