![嵌入式編程規(guī)范_第1頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/15/d9a97690-25b3-45bc-90e9-151a77a74e14/d9a97690-25b3-45bc-90e9-151a77a74e141.gif)
![嵌入式編程規(guī)范_第2頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/15/d9a97690-25b3-45bc-90e9-151a77a74e14/d9a97690-25b3-45bc-90e9-151a77a74e142.gif)
![嵌入式編程規(guī)范_第3頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/15/d9a97690-25b3-45bc-90e9-151a77a74e14/d9a97690-25b3-45bc-90e9-151a77a74e143.gif)
![嵌入式編程規(guī)范_第4頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/15/d9a97690-25b3-45bc-90e9-151a77a74e14/d9a97690-25b3-45bc-90e9-151a77a74e144.gif)
![嵌入式編程規(guī)范_第5頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/15/d9a97690-25b3-45bc-90e9-151a77a74e14/d9a97690-25b3-45bc-90e9-151a77a74e145.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、嵌入式編程規(guī)范1 基本要求1) 程序結(jié)構(gòu)清晰,簡單易懂,單個(gè)函數(shù)的程序行數(shù)不得超過100行,每行代碼不得超過100列。2) 打算干什么,要簡單,直接了當(dāng),代碼精簡,避免垃圾程序。3) 盡量使用標(biāo)準(zhǔn)庫函數(shù)和公共函數(shù)。4) 不要隨意定義全局變量,盡量使用局部變量。5) 使用括號以避免二義性。 2 可讀性要求1) 可讀性第一,效率第二。2) 保持注釋與代碼完全一致。3) 每個(gè)源程序文件,都有文件頭說明,說明規(guī)格見規(guī)范。4) 每個(gè)函數(shù),都有函數(shù)頭說明,說明規(guī)格見規(guī)范。5) 主要變量(結(jié)構(gòu)、聯(lián)合、類或?qū)ο螅┒x或引用時(shí),注釋能反映其含義。6) 常量定義(DEFINE)有相應(yīng)說明。7) 處理過程的每個(gè)階段
2、都有相關(guān)注釋說明。8) 在典型算法前都有注釋。9) 用縮進(jìn)來顯示程序的邏輯結(jié)構(gòu),縮進(jìn)量一致并以Tab鍵為單位,定義Tab為 4個(gè)字節(jié)。10) 循環(huán)、分支層次不要超過五層。11) 注釋可以與語句在同一行,也可以在上行。12) 空行和空白字符也是一種特殊注釋。13) 一目了然的語句不加注釋。14) 注釋的作用范圍可以為:定義、引用、條件分支以及一段代碼。15) 注釋行數(shù)(不包括程序頭和函數(shù)頭說明部份)應(yīng)占總行數(shù)的 1/5 到 1/3 。3 結(jié)構(gòu)化要求1) 禁止出現(xiàn)兩條等價(jià)的支路。2) 禁止GOTO語句。3) 用 IF 語句來強(qiáng)調(diào)只執(zhí)行兩組語句中的一組。禁止 ELSE GOTO 和 ELSE RET
3、URN。4) 用 CASE 實(shí)現(xiàn)多路分支。5) 避免從循環(huán)引出多個(gè)出口。6) 函數(shù)只有一個(gè)出口。7) 不使用條件賦值語句。8) 避免不必要的分支。9) 不要輕易用條件分支去替換邏輯表達(dá)式。4 正確性與容錯性要求1) 程序首先是正確,其次是優(yōu)美。2) 無法證明你的程序沒有錯誤,因此在編寫完一段程序后,應(yīng)先回頭檢查。3) 改一個(gè)錯誤時(shí)可能產(chǎn)生新的錯誤,因此在修改前首先考慮對其它程序的影響。4) 所有變量在調(diào)用前必須被初始化。5) 對所有的用戶輸入,必須進(jìn)行合法性檢查。6) 不要比較浮點(diǎn)數(shù)的相等,如: 10.0 * 0.1 = 1.0 , 不可靠7) 程序與環(huán)境或狀態(tài)發(fā)生關(guān)系時(shí),必須主動去處理發(fā)生的
4、意外事件,如文件能否邏輯鎖定、打印機(jī)是否聯(lián)機(jī)等。8) 單元測試也是編程的一部份,提交聯(lián)調(diào)測試的程序必須通過單元測試。5 可重用性要求1) 重復(fù)使用的完成相對獨(dú)立功能的算法或代碼應(yīng)抽象為公共控件或類。2) 公共控件或類應(yīng)考慮OO思想,減少外界聯(lián)系,考慮獨(dú)立性或封裝性。3) 公共控件或類應(yīng)建立使用模板。6 編碼具體規(guī)范6. 1 排版l 程序塊要采用縮進(jìn)風(fēng)格編寫(1)縮進(jìn)的空格數(shù)為4個(gè)。(2)函數(shù)或過程的開始、結(jié)構(gòu)的定義及循環(huán)、判斷等語句中的代碼都要采用縮進(jìn)風(fēng)格,case語句下的情況處理語句也要遵從語句縮進(jìn)要求。示例:int delch(char str , char c) int i, j; fo
5、r (i = j = 0; stri != ''0' i+) if (stri != c) strj+ = stri; strj = ''0' (3)在函數(shù)體的開始、類的定義、結(jié)構(gòu)的定義、枚舉的定義以及if、for、do、while、switch、case語句中的程序都要采用如上的縮進(jìn)方式。l 大括號和的使用(1)程序塊的分界符(如C/C+語言的大括號和)應(yīng)各獨(dú)占一行并且位于同一列,同時(shí)與引用它們的語句左對齊。示例:如下例子不符合規(guī)范。for (.) . /* program code */if (.) . /* program code */
6、void example_fun( void ) . /* program code */ 應(yīng)如下書寫。for (.) . /* program code */if (.) . /* program code */void example_fun( void ) . /* program code */(2)if、for、do、while、case、switch、default等語句自占一行,且if、for、do、while等語句的執(zhí)行語句部分無論多少都要加括號 。 示例:如下例子不符合規(guī)范。if (pUserCR = NULL) return;應(yīng)如下書寫:if (pUserCR = NULL
7、) return;l 在兩個(gè)以上的關(guān)鍵字、變量、常量進(jìn)行對等操作時(shí),它們之間的操作符之前、之后或者前后要加空格;進(jìn)行非對等操作時(shí),如果是關(guān)系密切的立即操作符(如>),后不應(yīng)加空格。說明:采用這種松散方式編寫代碼的目的是使代碼更加清晰。由于留空格所產(chǎn)生的清晰性是相對的,所以,在已經(jīng)非常清晰的語句中沒有必要再留空格,如果語句已足夠清晰則括號內(nèi)側(cè)(即左括號后面和右括號前面)不需要加空格,多重括號間不必加空格,因?yàn)樵贑語言中括號已經(jīng)是最清晰的標(biāo)志了。在長語句中,如果需要加的空格非常多,那么應(yīng)該保持整體清晰,而在局部不加空格。給操作符留空格時(shí)不要連續(xù)留兩個(gè)以上空格。示例:(1) 逗號、分號只在后面
8、加空格。int a, b, c; (2) 比較操作符, 賦值操作符"="、 "+=",算術(shù)操作符"+"、"%",邏輯操作符"&&"、"&",位運(yùn)算符"<<"、""等雙目操作符的前后加空格。if (current_time >= MAX_TIME_VALUE) a = b + c;a *= 2;a = b 2;(3) "!"、""、"+"
9、、"-"、"&"(地址運(yùn)算符)等單目操作符前后不加空格。*p = ''a' /* 內(nèi)容操作"*"與內(nèi)容之間 */flag = !isEmpty; /* 非操作"!"與內(nèi)容之間 */p = &mem; /* 地址操作"&" 與內(nèi)容之間 */i+; /* "+","-"與內(nèi)容之間 */(4) "->"、"."前后不加空格。p->id = pid; /* &quo
10、t;->"指針前后不加空格 */(5) if、for、while、switch等與后面的括號間應(yīng)加空格,使if等關(guān)鍵字更為突出、明顯。if (a >= b && c > d)l 較長語句與表達(dá)式的書寫處理方法(1)較長的語句(>80字符)要分成多行書寫,長表達(dá)式要在低優(yōu)先級操作符處劃分新行,操作符放在新行之首,劃分出的新行要進(jìn)行適當(dāng)?shù)目s進(jìn),使排版整齊,語句可讀。示例:report_or_not_flag = (taskno < MAX_ACT_TASK_NUMBER) && (n7stat_stat_item_valid
11、(stat_item) && (act_task_tabletaskno.result_data != 0);(2)循環(huán)、判斷等語句中若有較長的表達(dá)式或語句,則要進(jìn)行適應(yīng)的劃分,長表達(dá)式要在低優(yōu)先級操作符處劃分新行,操作符放在新行之首。示例:for (i = 0, j = 0; (i < first_word_length) && (j < second_word_length); i+, j+) . / program code (3)若函數(shù)或過程中的參數(shù)較長,則要進(jìn)行適當(dāng)?shù)膭澐?。建議:一行程序以小于80字符為宜,不要寫得過長。l 不允許把多個(gè)短語
12、句寫在一行中,即一行只寫一條語句。示例:如下例子不符合規(guī)范。length = 0; width = 0;應(yīng)如下書寫length = 0;width = 0;l 相對獨(dú)立的程序塊之間、變量說明之后必須加空行。示例:如下例子不符合規(guī)范。if (!valid_ni(ni) . / program coderepssn_ind = ssn_dataindex.repssn_index;repssn_ni = ssn_dataindex.ni;6. 2 注釋l 注釋應(yīng)與其描述的代碼相近,對代碼的注釋應(yīng)放在其上方或右方(對單條語句的注釋)相鄰位置,不可放在下面。示例:如下例子不符合規(guī)范。/* get re
13、plicate sub system index and net indicator */repssn_ind = ssn_dataindex.repssn_index;repssn_ni = ssn_dataindex.ni;l 將注釋與其上面的代碼用空行隔開。示例:如下例子,顯得代碼過于緊湊。/* code one comments */program code one/* code two comments */program code two應(yīng)如下書寫/* code one comments */program code one/* code two comments */progra
14、m code twol 注釋與所描述內(nèi)容進(jìn)行同樣的縮排。說明:可使程序排版整齊,并方便注釋的閱讀與理解。示例:如下例子,排版不整齊,閱讀稍感不方便。void example_fun( void )/* code one comments */ CodeBlock One /* code two comments */ CodeBlock Two應(yīng)改為如下布局。void exampleFun( void ) /* code one comments */ CodeBlock One /* code two comments */ CodeBlock Two6. 3 標(biāo)識符命名l 標(biāo)識符的命名要清
15、晰、明了,有明確含義,同時(shí)使用完整的單詞或大家基本可以理解的縮寫,避免使人產(chǎn)生誤解。說明:較短的單詞可通過去掉“元音”形成縮寫;較長的單詞可取單詞的頭幾個(gè)字母形成縮寫;一些單詞有大家公認(rèn)的縮寫。示例:如下單詞的縮寫能夠被大家基本認(rèn)可。temp 可縮寫為 tmp ;flag 可縮寫為 flg ;statistic 可縮寫為 stat ;increment 可縮寫為 inc ;message 可縮寫為 msg ;l 命名中若使用特殊約定或縮寫,則要有注釋說明。說明:應(yīng)該在源文件的開始之處,對文件中所使用的縮寫或約定,特別是特殊的縮寫,進(jìn)行必要的注釋說明。l 對于變量命名,盡量不選用單個(gè)字符(如i、
16、j、k.),建議除了要有具體含義外,還能表明其變量類型、數(shù)據(jù)類型等,但i、j、k作局部循環(huán)變量是允許的。說明:變量,尤其是局部變量,如果用單個(gè)字符表示,很容易敲錯(如i寫成j),而編譯時(shí)又檢查不出來,有可能為了這個(gè)小小的錯誤而花費(fèi)大量的查錯時(shí)間。示例:下面所示的局部變量名的定義方法可以借鑒。int liv_Width其變量名解釋如下: l 局部變量(Local)(其它:g全局變量(Global).) i 數(shù)據(jù)類型(Interger) v 變量(Variable)(其它:c常量(Const).) Width 變量含義這樣可以防止局部變量與全局變量重名。建議3-2:用正確的反義詞組命名具有互斥意義
17、的變量或相反動作的函數(shù)等。說明:下面是一些在軟件中常用的反義詞組。add / remove begin / end create / destroy insert / delete first / last get / releaseincrement / decrement put / getadd / delete lock / unlock open / closemin / max old / new start / stopnext / previous source / target show / hidesend / receive source / destinationcut
18、 / paste up / down示例:int min_sum;int max_sum;6. 4 可讀性l 注意運(yùn)算符的優(yōu)先級,并用括號明確表達(dá)式的操作順序,避免使用默認(rèn)優(yōu)先級。說明:防止閱讀程序時(shí)產(chǎn)生誤解,防止因默認(rèn)的優(yōu)先級與設(shè)計(jì)思想不符而導(dǎo)致程序出錯。示例:下列語句中的表達(dá)式word = (high << 8) | low (1)if (a | b) && (a & c) (2)if (a | b) < (c & d) (3)如果書寫為high << 8 | lowa | b && a & ca | b
19、 < 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)造成了判斷條件出錯。l 避免使用不易理解的數(shù)字,用有意義的標(biāo)識來替代。涉及物理狀態(tài)或者含有物理意義的常量,不應(yīng)直接使用數(shù)字,必須用有意義的枚舉或宏來代替。示例:如下的程序可讀性差。if (Trunkindex.t
20、runk_state = 0) Trunkindex.trunk_state = 1; . / program code應(yīng)改為如下形式。#define TRUNK_IDLE 0#define TRUNK_BUSY 1if (Trunkindex.trunk_state = TRUNK_IDLE) Trunkindex.trunk_state = TRUNK_BUSY; . / program code建議4-1:不要使用難懂的技巧性很高的語句,除非很有必要時(shí)。說明:高技巧語句不等于高效率的程序,實(shí)際上程序的效率關(guān)鍵在于算法。示例:如下表達(dá)式,考慮不周就可能出問題,也較難理解。* stat_po
21、i + += 1;* + stat_poi += 1;應(yīng)分別改為如下。*stat_poi += 1;stat_poi+; / 此二語句功能相當(dāng)于“ * stat_poi + += 1; ”+ stat_poi;*stat_poi += 1; / 此二語句功能相當(dāng)于“ * + stat_poi += 1; ”l 避免使用多層次的指針、結(jié)構(gòu)體訪問parent->p_datai.a.bj-1.f1=0;parent->p_datai.a.bj-1.f2=0;parent->p_datai.a.bj-1.f3=0;parent->p_datai.a.bj-1.f4=0;pare
22、nt->p_datai.a.bj-1.f5=0;parent->p_datai.a.bj-1.f6=0;parent->p_datai.a.bj-1.f7=0;parent->p_datai.a.bj-1.f8=0; 假定b的結(jié)構(gòu)為struct B, 則可改寫為:struct B *b=&(parent->p_datai.a.bj-1);b->f1=0;b->f2=0;b->f3=0;b->f4=0;b->f5=0;b->f6=0;b->f7=0;b->f8=0;6. 5 函數(shù)、過程建議5-1:一個(gè)函數(shù)僅完成一件功能。建議5-2:為簡單功能編寫函數(shù)。說明:雖然為僅用一兩行就可完成的功能去編函數(shù)好象沒有必要,但用函數(shù)可使功能明確化,增加程序可讀性,亦可方便維護(hù)、測試。示例:如下語句的功能不很明顯。value = ( a > 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);建議5-3:不要設(shè)計(jì)多
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年全球及中國工業(yè)級4-芐氧基苯酚行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報(bào)告
- 2025年全球及中國石墨片保護(hù)膜行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報(bào)告
- 2025年全球及中國消費(fèi)電子NFC天線行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報(bào)告
- 2025年全球及中國旅游廣告和營銷服務(wù)行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報(bào)告
- 2025-2030全球非侵入式血流動力學(xué)監(jiān)測解決方案行業(yè)調(diào)研及趨勢分析報(bào)告
- 2025年全球及中國光伏舟托行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報(bào)告
- 2025年全球及中國晶須碳納米管行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報(bào)告
- 2025年全球及中國溴化鈣粉行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報(bào)告
- 2025-2030全球高壓鎳氫電池行業(yè)調(diào)研及趨勢分析報(bào)告
- 2025年全球及中國智能電能量數(shù)據(jù)采集終端行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報(bào)告
- 2025年度新能源汽車充電站運(yùn)營權(quán)轉(zhuǎn)讓合同樣本4篇
- 第5課 隋唐時(shí)期的民族交往與交融 課件(23張) 2024-2025學(xué)年統(tǒng)編版七年級歷史下冊
- 2024年全國職業(yè)院校技能大賽高職組(生產(chǎn)事故應(yīng)急救援賽項(xiàng))考試題庫(含答案)
- 2024年江蘇農(nóng)牧科技職業(yè)學(xué)院高職單招語文歷年參考題庫含答案解析
- 廣聯(lián)達(dá)智慧工地合同范例
- 老年上消化道出血急診診療專家共識2024
- 廣東省廣州黃埔區(qū)2023-2024學(xué)年八年級上學(xué)期期末物理試卷(含答案)
- 醫(yī)院護(hù)理10s管理
- 人教版一年級下冊數(shù)學(xué)第五單元認(rèn)識人民幣練習(xí)
- 學(xué)校安全工作計(jì)劃及行事歷
- 《GMP基礎(chǔ)知識培訓(xùn)》課件
評論
0/150
提交評論