開關(guān)電源組C語(yǔ)言編程規(guī)范ppt課件
《開關(guān)電源組C語(yǔ)言編程規(guī)范ppt課件》由會(huì)員分享,可在線閱讀,更多相關(guān)《開關(guān)電源組C語(yǔ)言編程規(guī)范ppt課件(48頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
,,C語(yǔ)言編程規(guī)范 編寫出簡(jiǎn)潔、可維護(hù)、可靠、可測(cè)試、高效、可移植的代碼,內(nèi)部公開,前言,提高作品競(jìng)爭(zhēng)力,要在以下幾個(gè)方面下功夫: 提高規(guī)劃水平,把握正確的方向(戰(zhàn)略) 提高設(shè)計(jì)水平,搭建合理的系統(tǒng)(戰(zhàn)術(shù)) 提高編碼水平,開發(fā)穩(wěn)定的代碼(單兵作戰(zhàn)技能),前言,我們?yōu)槭裁匆M(jìn)行C語(yǔ)言編程規(guī)范培訓(xùn)? 最好的醫(yī)術(shù)是預(yù)防 真正的難問(wèn)題往往是低級(jí)錯(cuò)誤引起的 我們的編碼水平不容樂觀 C是程序員的語(yǔ)言,前言,要提高編碼水平,每個(gè)開發(fā)人員要做到: 勤學(xué)苦練,提高編程技能 前車之鑒,后世之師,不犯同樣的錯(cuò)誤; 堅(jiān)持代碼Review、PC-LINT檢查和單元測(cè)試; 總而言之,就是少犯錯(cuò)誤,盡早發(fā)現(xiàn)錯(cuò)誤,基礎(chǔ)篇之簡(jiǎn)單就是美,If (a a的值是多少?,基礎(chǔ)篇之簡(jiǎn)單就是美,這里沒有答案,只有問(wèn)題: 我們問(wèn)什么要寫這樣的代碼? 工作太輕松? BUG不夠多? 水平顯不出? ………… 如何改進(jìn)? 優(yōu)先級(jí)搞不清楚用括號(hào); 復(fù)合語(yǔ)句太羅嗦,拆成幾行來(lái)寫; 套用兩句廣告詞: 把簡(jiǎn)單的事情復(fù)雜化,太累 把復(fù)雜的事情簡(jiǎn)單化,貢獻(xiàn)!,基礎(chǔ)篇之簡(jiǎn)單就是美,編碼的三不原則 不要挑戰(zhàn)自己的記性 不要挑戰(zhàn)同事的耐心 不要挑戰(zhàn)編譯器的水平 編碼的三用原則 能用簡(jiǎn)單語(yǔ)句的,就不要用復(fù)雜的技巧 能用成熟代碼的,就不要再來(lái)一套 能用上工具的,就一定要機(jī)械化,代碼總體原則,1、清晰第一 清晰性是易于維護(hù)、易于重構(gòu)的程序必需具備的特征。代碼首先是給人讀的,好的代碼應(yīng)當(dāng)可以像文章一樣發(fā)聲朗誦出來(lái)。 目前軟件維護(hù)期成本占整個(gè)生命周期成本的40%~90%。根據(jù)業(yè)界經(jīng)驗(yàn),維護(hù)期變更代碼的成本,小型系統(tǒng)是開發(fā)期的5倍,大型系統(tǒng)(100萬(wàn)行代碼以上)可以達(dá)到100倍。業(yè)界的調(diào)查指出,開發(fā)組平均大約一半的人力用于彌補(bǔ)過(guò)去的錯(cuò)誤,而不是添加新的功能來(lái)幫助公司提高競(jìng)爭(zhēng)力。,代碼總體原則,2、簡(jiǎn)潔為美 簡(jiǎn)潔就是易于理解并且易于實(shí)現(xiàn)。代碼越長(zhǎng)越難以看懂,也就越容易在修改時(shí)引入錯(cuò)誤。寫的代碼越多,意味著出錯(cuò)的地方越多,也就意味著代碼的可靠性越低。因此,我們提倡大家通過(guò)編寫簡(jiǎn)潔明了的代碼來(lái)提升代碼可靠性。 廢棄的代碼(沒有被調(diào)用的函數(shù)和全局變量)要及時(shí)清除,重復(fù)代碼應(yīng)該盡可能提煉成函數(shù)。,代碼總體原則,3、選擇合適的風(fēng)格,與代碼原有風(fēng)格保持一致 產(chǎn)品所有人共同分享同一種風(fēng)格所帶來(lái)的好處,遠(yuǎn)遠(yuǎn)超出為了統(tǒng)一而付出的代價(jià)。在公司已有編碼規(guī)范的指導(dǎo)下,審慎地編排代碼以使代碼盡可能清晰,是一項(xiàng)非常重要的技能。如果重構(gòu)/修改其他風(fēng)格的代碼時(shí),比較明智的做法是根據(jù)現(xiàn)有代碼的現(xiàn)有風(fēng)格繼續(xù)編寫代碼,1 頭文件,對(duì)于C語(yǔ)言來(lái)說(shuō),頭文件的設(shè)計(jì)體現(xiàn)了大部分的系統(tǒng)設(shè)計(jì)。不合理的頭文件布局是編譯時(shí)間過(guò)長(zhǎng)的根因,不合理的頭文件實(shí)際上不合理的設(shè)計(jì)。 術(shù)語(yǔ)定義: 依賴:本章節(jié)特指編譯依賴。若x.h包含了y.h,則稱作x依賴y。依賴關(guān)系會(huì)進(jìn)行傳導(dǎo),如x.h包含y.h,而y.h又包含了z.h,則x通過(guò)y依賴了z。依賴將導(dǎo)致編譯時(shí)間的上升。雖然依賴是不可避免的,也是必須的,但是不良的設(shè)計(jì)會(huì)導(dǎo)致整個(gè)系統(tǒng)的依賴關(guān)系無(wú)比復(fù)雜,使得任意一個(gè)文件的修改都要重新編譯整個(gè)系統(tǒng),導(dǎo)致編譯時(shí)間巨幅上升。,1 頭文件,原則1.1 頭文件中適合放置接口的聲明,不適合放置實(shí)現(xiàn)。 說(shuō)明:頭文件是模塊或單元(Unit)的對(duì)外接口。頭文件中應(yīng)放置對(duì)外部的聲明,如對(duì)外提供的函數(shù)聲明、宏定義、類型定義等。 內(nèi)部使用的函數(shù)聲明不應(yīng)放在頭文件中。 內(nèi)部使用的宏、枚舉、結(jié)構(gòu)定義不應(yīng)放入頭文件中。 變量定義不應(yīng)放在頭文件中,應(yīng)放在.c文件中。 變量的聲明盡量不要放在頭文件中,亦即盡量不要使用全局變量作為接口。變量是模塊或單元的內(nèi)部實(shí)現(xiàn)細(xì)節(jié),不應(yīng)通過(guò)在頭文件中聲明的方式直接暴露給外部,應(yīng)通過(guò)函數(shù)接口的方式進(jìn)行對(duì)外暴露。 即使必須使用全局變量,也只應(yīng)當(dāng)在.c中定義全局變量,在.h中僅聲明變量為全局的。,1 頭文件,原則1.2 頭文件應(yīng)當(dāng)職責(zé)單一。 說(shuō)明:頭文件過(guò)于復(fù)雜,依賴過(guò)于復(fù)雜是導(dǎo)致編譯時(shí)間過(guò)長(zhǎng)的主要原因。很多現(xiàn)有代碼中頭文件過(guò)大,職責(zé)過(guò)多,再加上循環(huán)依賴的問(wèn)題,可能導(dǎo)致為了在.c中使用一個(gè)宏,而包含十幾個(gè)頭文件。,1 頭文件,1 頭文件,規(guī)則1.1 每一個(gè).c文件應(yīng)有一個(gè)同名.h文件,用于聲明需要對(duì)外公開的接口。 說(shuō)明:如果一個(gè).c文件不需要對(duì)外公布任何接口,則其就不應(yīng)當(dāng)存在,除非它是程序的入口,如main函數(shù)所在的文件。 有些特別簡(jiǎn)單的頭文件,如命令I(lǐng)D定義頭文件,不需要有對(duì)應(yīng)的.c存在。,1 頭文件,規(guī)則1.2 禁止頭文件循環(huán)依賴。 說(shuō)明:頭文件循環(huán)依賴,指a.h包含b.h,b.h包含c.h,c.h包含a.h之類導(dǎo)致任何一個(gè)頭文件修改,都導(dǎo)致所有包含了a.h/b.h/c.h的代碼全部重新編譯一遍。而如果是單向依賴,如a.h包含b.h,b.h包含c.h,而c.h不包含任何頭文件,則修改a.h不會(huì)導(dǎo)致包含了b.h/c.h的源代碼重新編譯。,1 頭文件,規(guī)則1.3 .c/.h文件禁止包含用不到的頭文件。 說(shuō)明:很多系統(tǒng)中頭文件包含關(guān)系復(fù)雜,開發(fā)人員為了省事起見,可能不會(huì)去一一鉆研,直接包含一切想到的頭文件,甚至有些產(chǎn)品干脆發(fā)布了一個(gè)god.h,其中包含了所有頭文件,然后發(fā)布給各個(gè)項(xiàng)目組使用,這種只圖一時(shí)省事的做法,導(dǎo)致整個(gè)系統(tǒng)的編譯時(shí)間進(jìn)一步惡化,并對(duì)后來(lái)人的維護(hù)造成了巨大的麻煩。,1 頭文件,規(guī)則1.4 頭文件應(yīng)當(dāng)自包含。 說(shuō)明:簡(jiǎn)單的說(shuō),自包含就是任意一個(gè)頭文件均可獨(dú)立編譯。如果一個(gè)文件包含某個(gè)頭文件,還要包含另外一個(gè)頭文件才能工作的話,就會(huì)增加交流障礙,給這個(gè)頭文件的用戶增添不必要的負(fù)擔(dān)。 示例:如果a.h不是自包含的,需要包含b.h才能編譯,會(huì)帶來(lái)的危害: 每個(gè)使用a.h頭文件的.c文件,為了讓引入的a.h的內(nèi)容編譯通過(guò),都要包含額外的頭文件b.h。 額外的頭文件b.h必須在a.h之前進(jìn)行包含,這在包含順序上產(chǎn)生了依賴。,1 頭文件,規(guī)則1.5 總是編寫內(nèi)部#include保護(hù)符(#define 保護(hù))。 說(shuō)明:多次包含一個(gè)頭文件可以通過(guò)認(rèn)真的設(shè)計(jì)來(lái)避免。如果不能做到這一點(diǎn),就需要采取阻止頭文件內(nèi)容被包含多于一次的機(jī)制。 通常的手段是為每個(gè)文件配置一個(gè)宏,當(dāng)頭文件第一次被包含時(shí)就定義這個(gè)宏,并在頭文件被再次包含時(shí)使用它以排除文件內(nèi)容。,1 頭文件,規(guī)則1.6 禁止在頭文件中定義變量。 說(shuō)明:在頭文件中定義變量,將會(huì)由于頭文件被其他.c文件包含而導(dǎo)致變量重復(fù)定義。,1 頭文件,規(guī)則1.7 只能通過(guò)包含頭文件的方式使用其他.c提供的接口,禁止在.c中通過(guò)extern的方式使用外部函數(shù)接口、變量。 說(shuō)明:若a.c使用了b.c定義的foo()函數(shù),則應(yīng)當(dāng)在b.h中聲明extern int foo(int input);并在a.c中通過(guò)#include 來(lái)使用foo。禁止通過(guò)在a.c中直接寫extern int foo(int input);來(lái)使用foo,后面這種寫法容易在foo改變時(shí)可能導(dǎo)致聲明和定義不一致。,1 頭文件,規(guī)則1.7 只能通過(guò)包含頭文件的方式使用其他.c提供的接口,禁止在.c中通過(guò)extern的方式使用外部函數(shù)接口、變量。 說(shuō)明:若a.c使用了b.c定義的foo()函數(shù),則應(yīng)當(dāng)在b.h中聲明extern int foo(int input);并在a.c中通過(guò)#include 來(lái)使用foo。禁止通過(guò)在a.c中直接寫extern int foo(int input);來(lái)使用foo,后面這種寫法容易在foo改變時(shí)可能導(dǎo)致聲明和定義不一致。,1 頭文件,規(guī)則1.8 禁止在extern “C”中包含頭文件。,2 略,略,3 標(biāo)識(shí)符,原則3.1 標(biāo)識(shí)符的命名要清晰、明了,有明確含義,同時(shí)使用完整的單詞或大家基本可以理解的縮寫,避免使人產(chǎn)生誤解。 說(shuō)明:盡可能給出描述性名稱,不要節(jié)約空間,讓別人很快理解你的代碼更重要。 示例:好的命名:,3 標(biāo)識(shí)符,原則3.2 除了常見的通用縮寫以外,不使用單詞縮寫,不得使用漢語(yǔ)拼音。 說(shuō)明:較短的單詞可通過(guò)去掉“元音”形成縮寫,較長(zhǎng)的單詞可取單詞的頭幾個(gè)字母形成縮寫,一些單詞有大家公認(rèn)的縮寫,常用單詞的縮寫必須統(tǒng)一,4 略,略,5 宏,規(guī)則5.1 用宏定義表達(dá)式時(shí),要使用完備的括號(hào)。 說(shuō)明:因?yàn)楹曛皇呛?jiǎn)單的代碼替換,不會(huì)像函數(shù)一樣先將參數(shù)計(jì)算后,再傳遞。 #define RECTANGLE_AREA(a, b) (a * b) 則c/RECTANGLE_AREA(a, b) 將擴(kuò)展成c/a * b , c 與b 本應(yīng)該是除法運(yùn)算,結(jié)果變成了乘法運(yùn)算,造成錯(cuò)誤。,5 宏,規(guī)則5.2 將宏所定義的多條表達(dá)式放在大括號(hào)中。 說(shuō)明:更好的方法是多條語(yǔ)句寫成do while(0)的方式。,5 宏,規(guī)則5.3 使用宏時(shí),不允許參數(shù)發(fā)生變化。,5 宏,規(guī)則5.4 不允許直接使用魔鬼數(shù)字。 說(shuō)明:使用魔鬼數(shù)字的弊端:代碼難以理解;如果一個(gè)有含義的數(shù)字多處使用,一旦需要修改這個(gè)數(shù)值,代價(jià)慘重。 使用明確的物理狀態(tài)或物理意義的名稱能增加信息,并能提供單一的維護(hù)點(diǎn)。 解決途徑: 對(duì)于局部使用的唯一含義的魔鬼數(shù)字,可以在代碼周圍增加說(shuō)明注釋,也可以定義局部const變量,變量命名自注釋。 對(duì)于廣泛使用的數(shù)字,必須定義const全局變量/宏;同樣變量/宏命名應(yīng)是自注釋的。 0作為一個(gè)特殊的數(shù)字,作為一般默認(rèn)值使用沒有歧義時(shí),不用特別定義。,6-8 略,略,9 排版與格式,規(guī)則9.1 程序塊采用縮進(jìn)風(fēng)格編寫,每級(jí)縮進(jìn)為4個(gè)空格。 說(shuō)明:當(dāng)前各種編輯器/IDE都支持TAB鍵自動(dòng)轉(zhuǎn)空格輸入,需要打開相關(guān)功能并設(shè)置相關(guān)功能。 編輯器/IDE如果有顯示TAB的功能也應(yīng)該打開,方便及時(shí)糾正輸入錯(cuò)誤。 IDE向?qū)傻拇a可以不用修改。 宏定義、編譯開關(guān)、條件預(yù)處理語(yǔ)句可以頂格(或使用自定義的排版方案,但產(chǎn)品/模塊內(nèi)必須保持一致)。,9 排版與格式,規(guī)則9.2 相對(duì)獨(dú)立的程序塊之間、變量說(shuō)明之后必須加空行。,9 排版與格式,規(guī)則9.3 一條語(yǔ)句不能過(guò)長(zhǎng),如不能拆分需要分行寫。一行到底多少字符換行比較合適,產(chǎn)品可以自行確定 說(shuō)明:對(duì)于目前大多數(shù)的PC來(lái)說(shuō),132比較合適(80/132是VTY常見的行寬值);對(duì)于新PC寬屏顯示器較多的產(chǎn)品來(lái)說(shuō),可以設(shè)置更大的值。 換行時(shí)有如下建議: 換行時(shí)要增加一級(jí)縮進(jìn),使代碼可讀性更好; 低優(yōu)先級(jí)操作符處劃分新行;換行時(shí)操作符應(yīng)該也放下來(lái),放在新行首; 換行時(shí)建議一個(gè)完整的語(yǔ)句放在一行,不要根據(jù)字符數(shù)斷行,9 排版與格式,,9 排版與格式,規(guī)則9.4 多個(gè)短語(yǔ)句(包括賦值語(yǔ)句)不允許寫在同一行內(nèi),即一行只寫一條語(yǔ)句。,9 排版與格式,規(guī)則9.5 if、for、do、while、case、switch、default等語(yǔ)句獨(dú)占一行。 說(shuō)明:執(zhí)行語(yǔ)句必須用縮進(jìn)風(fēng)格寫,屬于if、for、do、while、case、switch、default等下一個(gè)縮進(jìn)級(jí)別; 一般寫if、for、do、while等語(yǔ)句都會(huì)有成對(duì)出現(xiàn)的?{}?,對(duì)此有如下建議可以參考: if、for、do、while等語(yǔ)句后的執(zhí)行語(yǔ)句建議增加成對(duì)的?{}?; 如果if/else配套語(yǔ)句中有一個(gè)分支有?{}?,那么令一個(gè)分支即使一行代碼也建議增加?{}?; 添加?{?的位置可以在if等語(yǔ)句后,也可以獨(dú)立占下一行;獨(dú)立占下一行時(shí),可以和if在一個(gè)縮進(jìn)級(jí)別,也可以在下一個(gè)縮進(jìn)級(jí)別;但是如果if語(yǔ)句很長(zhǎng),或者已經(jīng)有換行,建議?{?使用獨(dú)占一行的寫法。,9 排版與格式,規(guī)則9.6 在兩個(gè)以上的關(guān)鍵字、變量、常量進(jìn)行對(duì)等操作時(shí),它們之間的操作符之前、之后或者前后要加空格;進(jìn)行非對(duì)等操作時(shí),如果是關(guān)系密切的立即操作符(如-),后不應(yīng)加空格。 說(shuō)明:采用這種松散方式編寫代碼的目的是使代碼更加清晰。 在已經(jīng)非常清晰的語(yǔ)句中沒有必要再留空格,如括號(hào)內(nèi)側(cè)(即左括號(hào)后面和右括號(hào)前面)不需要加空格,多重括號(hào)間不必加空格,因?yàn)樵贑語(yǔ)言中括號(hào)已經(jīng)是最清晰的標(biāo)志了。 在長(zhǎng)語(yǔ)句中,如果需要加的空格非常多,那么應(yīng)該保持整體清晰,而在局部不加空格。給操作符留空格時(shí)不要連續(xù)留兩個(gè)以上空格。,9 排版與格式,9 排版與格式,9 排版與格式,建議9.1 注釋符(包括?/*??//??*/?)與注釋內(nèi)容之間要用一個(gè)空格進(jìn)行分隔。 說(shuō)明:這樣可以使注釋的內(nèi)容部分更清晰。 現(xiàn)在很多工具都可以批量生成、刪除'//'注釋,這樣有空格也比較方便統(tǒng)一處理。 建議9.2 源程序中關(guān)系較為緊密的代碼應(yīng)盡可能相鄰。,10 在定點(diǎn)處理器中的浮點(diǎn)運(yùn)算,在控制算法中,通常會(huì)碰到浮點(diǎn)數(shù) 例如:題目要求輸出電壓達(dá)到25.86V時(shí),產(chǎn)生過(guò)壓報(bào)警,你的程序如何計(jì)算?,10 在定點(diǎn)處理器中的浮點(diǎn)運(yùn)算,在控制算法中,通常會(huì)碰到浮點(diǎn)數(shù) 例如:題目要求輸出電壓達(dá)到2.86V時(shí),產(chǎn)生過(guò)壓報(bào)警,你的程序如何計(jì)算? 1.對(duì)輸出電壓進(jìn)行采樣得到ADvalue = 3905; 2.計(jì)算真實(shí)電壓值:Vo= (ADvalue / 4096) * 3.0 = 2.8601; 3.if(Vo = 2.86) { ProtectProcess(); } 上述方法出現(xiàn)了好幾處浮點(diǎn)運(yùn)算,一般比賽程序比較大,一旦使用這種方法,必然使工程中出現(xiàn)大量的浮點(diǎn)運(yùn)算。該怎么做?,10 在定點(diǎn)處理器中的浮點(diǎn)運(yùn)算,1.對(duì)輸出電壓進(jìn)行采樣得到ADvalue = 3905; 1.對(duì)輸出電壓進(jìn)行采樣得到ADvalue = 3905;人工(或者編譯器)事先計(jì)算2.86V電壓對(duì)應(yīng)的ADvalueProtect = 3904; 2.計(jì)算真實(shí)電壓值:Vo= (ADvalue / 4096) * 3.0 = 2.8601; 2.不做這一步 3.if(Vo = 2.86) { ProtectProcess(); } 3.if(ADvalue = ADvalueProtect ) ….,10 在定點(diǎn)處理器中的浮點(diǎn)運(yùn)算,若仍需要計(jì)算真實(shí)電壓值以便進(jìn)行顯示,則可以: 1.定義浮點(diǎn)變量,然后計(jì)算真實(shí)電壓值:Vo= (ADvalue / 4096) * 3.0 = 2.8601;(錯(cuò)誤方法!) 2.定義整型變量,然后計(jì)算真實(shí)電壓值:Vo= (ADvalue / 4096) * 3.0 = ? 3.定義整型變量,然后計(jì)算真實(shí)電壓被放大1000倍(看需要選擇放大倍數(shù))值:Vo= ((ADvalue * 1000) / 4096) * 3.0 = 2860 10000倍呢? Vo= ((ADvalue * 10000 ) / 4096) * 3.0 = 28601 現(xiàn)在會(huì)在LCD上顯示真實(shí)值嗎?,10 在定點(diǎn)處理器中的浮點(diǎn)運(yùn)算,更嚴(yán)格的要求是采用 Qn格式進(jìn)行計(jì)算,感興趣的同學(xué)自己查閱相關(guān)資料,其原理也是對(duì)浮點(diǎn)數(shù)進(jìn)行放大處理,需要記住小數(shù)點(diǎn)位置。作為比賽,可以采用前述簡(jiǎn)單方法以避免浮點(diǎn)運(yùn)算。,- 1.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來(lái)的問(wèn)題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐng)點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
20 積分
下載 |
- 配套講稿:
如PPT文件的首頁(yè)顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國(guó)旗、國(guó)徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 開關(guān)電源 語(yǔ)言 編程 規(guī)范 ppt 課件
鏈接地址:http://kudomayuko.com/p-1683591.html