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