版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、C語言編程規(guī)范編寫出簡潔、可維護、可靠、可測試、高效、可移植的代碼內(nèi)部公開前言提高作品競爭力,要在以下幾個方面下功夫:提高規(guī)劃水平,把握正確的方向(戰(zhàn)略)提高設(shè)計水平,搭建合理的系統(tǒng)(戰(zhàn)術(shù))提高編碼水平,開發(fā)穩(wěn)定的代碼(單兵作戰(zhàn)技能)前言我們?yōu)槭裁匆M行C語言編程規(guī)范培訓(xùn)?最好的醫(yī)術(shù)是預(yù)防真正的難問題往往是低級錯誤引起的我們的編碼水平不容樂觀C是程序員的語言前言要提高編碼水平,每個開發(fā)人員要做到:勤學(xué)苦練,提高編程技能前車之鑒,后世之師,不犯同樣的錯誤;堅持代碼Review、PC-LINT檢查和單元測試;總而言之,就是少犯錯誤,盡早發(fā)現(xiàn)錯誤基礎(chǔ)篇之簡單就是美If (a & b | c | d
2、= e & f)這個表達式的正確運算順序是什么?test(a+, +a, a+, +a, a+, +a)a = 1;實際函數(shù)調(diào)用時,傳入的參數(shù)值分別是多少?(+*p+) (-*q-)語義是什么?a= b=1,c=2,d=3; e=4;a的值是多少?基礎(chǔ)篇之簡單就是美這里沒有答案,只有問題:我們問什么要寫這樣的代碼?工作太輕松?BUG不夠多?水平顯不出?如何改進?優(yōu)先級搞不清楚用括號;復(fù)合語句太羅嗦,拆成幾行來寫;套用兩句廣告詞:把簡單的事情復(fù)雜化,太累把復(fù)雜的事情簡單化,貢獻!基礎(chǔ)篇之簡單就是美編碼的三不原則不要挑戰(zhàn)自己的記性不要挑戰(zhàn)同事的耐心不要挑戰(zhàn)編譯器的水平編碼的三用原則能用簡單語句的,
3、就不要用復(fù)雜的技巧能用成熟代碼的,就不要再來一套能用上工具的,就一定要機械化代碼總體原則1、清晰第一 清晰性是易于維護、易于重構(gòu)的程序必需具備的特征。代碼首先是給人讀的,好的代碼應(yīng)當(dāng)可以像文章一樣發(fā)聲朗誦出來。 目前軟件維護期成本占整個生命周期成本的40%90%。根據(jù)業(yè)界經(jīng)驗,維護期變更代碼的成本,小型系統(tǒng)是開發(fā)期的5倍,大型系統(tǒng)(100萬行代碼以上)可以達到100倍。業(yè)界的調(diào)查指出,開發(fā)組平均大約一半的人力用于彌補過去的錯誤,而不是添加新的功能來幫助公司提高競爭力。 代碼總體原則2、簡潔為美 簡潔就是易于理解并且易于實現(xiàn)。代碼越長越難以看懂,也就越容易在修改時引入錯誤。寫的代碼越多,意味著出
4、錯的地方越多,也就意味著代碼的可靠性越低。因此,我們提倡大家通過編寫簡潔明了的代碼來提升代碼可靠性。 廢棄的代碼(沒有被調(diào)用的函數(shù)和全局變量)要及時清除,重復(fù)代碼應(yīng)該盡可能提煉成函數(shù)。 代碼總體原則3、選擇合適的風(fēng)格,與代碼原有風(fēng)格保持一致 產(chǎn)品所有人共同分享同一種風(fēng)格所帶來的好處,遠遠超出為了統(tǒng)一而付出的代價。在公司已有編碼規(guī)范的指導(dǎo)下,審慎地編排代碼以使代碼盡可能清晰,是一項非常重要的技能。如果重構(gòu)/修改其他風(fēng)格的代碼時,比較明智的做法是根據(jù)現(xiàn)有代碼的現(xiàn)有風(fēng)格繼續(xù)編寫代碼1 頭文件 對于C語言來說,頭文件的設(shè)計體現(xiàn)了大部分的系統(tǒng)設(shè)計。不合理的頭文件布局是編譯時間過長的根因,不合理的頭文件實
5、際上不合理的設(shè)計。 術(shù)語定義: 依賴:本章節(jié)特指編譯依賴。若x.h包含了y.h,則稱作x依賴y。依賴關(guān)系會進行傳導(dǎo),如x.h包含y.h,而y.h又包含了z.h,則x通過y依賴了z。依賴將導(dǎo)致編譯時間的上升。雖然依賴是不可避免的,也是必須的,但是不良的設(shè)計會導(dǎo)致整個系統(tǒng)的依賴關(guān)系無比復(fù)雜,使得任意一個文件的修改都要重新編譯整個系統(tǒng),導(dǎo)致編譯時間巨幅上升。 1 頭文件 原則1.1 頭文件中適合放置接口的聲明,不適合放置實現(xiàn)。 說明:頭文件是模塊或單元(Unit)的對外接口。頭文件中應(yīng)放置對外部的聲明,如對外提供的函數(shù)聲明、宏定義、類型定義等。 內(nèi)部使用的函數(shù)聲明不應(yīng)放在頭文件中。 內(nèi)部使用的宏、枚
6、舉、結(jié)構(gòu)定義不應(yīng)放入頭文件中。 變量定義不應(yīng)放在頭文件中,應(yīng)放在.c文件中。 變量的聲明盡量不要放在頭文件中,亦即盡量不要使用全局變量作為接口。變量是模塊或單元的內(nèi)部實現(xiàn)細節(jié),不應(yīng)通過在頭文件中聲明的方式直接暴露給外部,應(yīng)通過函數(shù)接口的方式進行對外暴露。 即使必須使用全局變量,也只應(yīng)當(dāng)在.c中定義全局變量,在.h中僅聲明變量為全局的。 1 頭文件 原則1.2 頭文件應(yīng)當(dāng)職責(zé)單一。 說明:頭文件過于復(fù)雜,依賴過于復(fù)雜是導(dǎo)致編譯時間過長的主要原因。很多現(xiàn)有代碼中頭文件過大,職責(zé)過多,再加上循環(huán)依賴的問題,可能導(dǎo)致為了在.c中使用一個宏,而包含十幾個頭文件。 1 頭文件 1 頭文件 規(guī)則1.1 每一
7、個.c文件應(yīng)有一個同名.h文件,用于聲明需要對外公開的接口。 說明:如果一個.c文件不需要對外公布任何接口,則其就不應(yīng)當(dā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之類導(dǎo)致任何一個頭文件修改,都導(dǎo)致所有包含了a.h/b.h/c.h的代碼全部重新編譯一遍。而如果是單向依賴,如a.h包含b.h,b.h包含c.h,而c.h不包含任何頭文件,則修改a.h不會導(dǎo)致包含了b.h/c.h的源代碼重新編譯。 1
8、 頭文件 規(guī)則1.3 .c/.h文件禁止包含用不到的頭文件。 說明:很多系統(tǒng)中頭文件包含關(guān)系復(fù)雜,開發(fā)人員為了省事起見,可能不會去一一鉆研,直接包含一切想到的頭文件,甚至有些產(chǎn)品干脆發(fā)布了一個god.h,其中包含了所有頭文件,然后發(fā)布給各個項目組使用,這種只圖一時省事的做法,導(dǎo)致整個系統(tǒng)的編譯時間進一步惡化,并對后來人的維護造成了巨大的麻煩。 1 頭文件 規(guī)則1.4 頭文件應(yīng)當(dāng)自包含。 說明:簡單的說,自包含就是任意一個頭文件均可獨立編譯。如果一個文件包含某個頭文件,還要包含另外一個頭文件才能工作的話,就會增加交流障礙,給這個頭文件的用戶增添不必要的負擔(dān)。 示例:如果a.h不是自包含的,需要包
9、含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)容被包含多于一次的機制。 通常的手段是為每個文件配置一個宏,當(dāng)頭文件第一次被包含時就定義這個宏,并在頭文件被再次包含時使用它以排除文件內(nèi)容。 1 頭文件 規(guī)則1.6 禁止在頭文件中定義變量。 說明:在頭文件中定義變量,將
10、會由于頭文件被其他.c文件包含而導(dǎo)致變量重復(fù)定義。 1 頭文件 規(guī)則1.7 只能通過包含頭文件的方式使用其他.c提供的接口,禁止在.c中通過extern的方式使用外部函數(shù)接口、變量。 說明:若a.c使用了b.c定義的foo()函數(shù),則應(yīng)當(dāng)在b.h中聲明extern int foo(int input);并在a.c中通過#include 來使用foo。禁止通過在a.c中直接寫extern int foo(int input);來使用foo,后面這種寫法容易在foo改變時可能導(dǎo)致聲明和定義不一致。 1 頭文件 規(guī)則1.7 只能通過包含頭文件的方式使用其他.c提供的接口,禁止在.c中通過extern
11、的方式使用外部函數(shù)接口、變量。 說明:若a.c使用了b.c定義的foo()函數(shù),則應(yīng)當(dāng)在b.h中聲明extern int foo(int input);并在a.c中通過#include 來使用foo。禁止通過在a.c中直接寫extern int foo(int input);來使用foo,后面這種寫法容易在foo改變時可能導(dǎo)致聲明和定義不一致。 1 頭文件 規(guī)則1.8 禁止在extern “C”中包含頭文件。 2 略略 3 標識符原則3.1 標識符的命名要清晰、明了,有明確含義,同時使用完整的單詞或大家基本可以理解的縮寫,避免使人產(chǎn)生誤解。 說明:盡可能給出描述性名稱,不要節(jié)約空間,讓別人很快
12、理解你的代碼更重要。 示例:好的命名: 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é)果變成了乘法運算,造成錯誤。
13、 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作為
14、一個特殊的數(shù)字,作為一般默認值使用沒有歧義時,不用特別定義。 6-8 略略 9 排版與格式 規(guī)則9.1 程序塊采用縮進風(fēng)格編寫,每級縮進為4個空格。 說明:當(dāng)前各種編輯器/IDE都支持TAB鍵自動轉(zhuǎn)空格輸入,需要打開相關(guān)功能并設(shè)置相關(guān)功能。 編輯器/IDE如果有顯示TAB的功能也應(yīng)該打開,方便及時糾正輸入錯誤。 IDE向?qū)傻拇a可以不用修改。 宏定義、編譯開關(guān)、條件預(yù)處理語句可以頂格(或使用自定義的排版方案,但產(chǎn)品/模塊內(nèi)必須保持一致)。 9 排版與格式 規(guī)則9.2 相對獨立的程序塊之間、變量說明之后必須加空行。 9 排版與格式 規(guī)則9.3 一條語句不能過長,如不能拆分需要分行寫。一行到底
15、多少字符換行比較合適,產(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í)行
16、語句必須用縮進風(fēng)格寫,屬于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)鍵字、變量、常量進行對等操作
17、時,它們之間的操作符之前、之后或者前后要加空格;進行非對等操作時,如果是關(guān)系密切的立即操作符(如),后不應(yīng)加空格。 說明:采用這種松散方式編寫代碼的目的是使代碼更加清晰。 在已經(jīng)非常清晰的語句中沒有必要再留空格,如括號內(nèi)側(cè)(即左括號后面和右括號前面)不需要加空格,多重括號間不必加空格,因為在C語言中括號已經(jīng)是最清晰的標志了。 在長語句中,如果需要加的空格非常多,那么應(yīng)該保持整體清晰,而在局部不加空格。給操作符留空格時不要連續(xù)留兩個以上空格。 9 排版與格式 9 排版與格式 9 排版與格式 建議9.1 注釋符(包括/*/*/)與注釋內(nèi)容之間要用一個空格進行分隔。 說明:這樣可以使注釋的內(nèi)容部分更
18、清晰。 現(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.對輸出電壓進行
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年礦業(yè)權(quán)抵押融資合同示范3篇
- 二零二五年新型環(huán)保欄桿研發(fā)、生產(chǎn)安裝合同3篇
- 二零二五版礦業(yè)權(quán)轉(zhuǎn)讓與安全生產(chǎn)監(jiān)管服務(wù)合同集3篇
- 二零二五版建筑工程BIM模型優(yōu)化與交付合同3篇
- 二零二五年混凝土施工安全生產(chǎn)責(zé)任書合同3篇
- 二零二五版掛靠出租車綠色出行獎勵合同3篇
- 提前終止2025年度租賃合同2篇
- 商鋪售后返租合同糾紛的司法解釋與實踐(2025年版)2篇
- 二零二五版畜禽養(yǎng)殖合作經(jīng)營合同書3篇
- 二零二五年度廢舊玻璃回收利用合同書3篇
- 專題6.8 一次函數(shù)章末測試卷(拔尖卷)(學(xué)生版)八年級數(shù)學(xué)上冊舉一反三系列(蘇科版)
- GB/T 4167-2024砝碼
- 老年人視覺障礙護理
- 《腦梗塞的健康教育》課件
- 《請柬及邀請函》課件
- 中小銀行上云趨勢研究分析報告
- 遼寧省普通高中2024-2025學(xué)年高一上學(xué)期12月聯(lián)合考試語文試題(含答案)
- 青海原子城的課程設(shè)計
- 2023年年北京市各區(qū)初三語文一模分類試題匯編 - 作文
- 常州大學(xué)《新媒體文案創(chuàng)作與傳播》2023-2024學(xué)年第一學(xué)期期末試卷
- 麻醉蘇醒期躁動患者護理
評論
0/150
提交評論