




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、嵌入式系統(tǒng)中的C語言編碼規(guī)范2004-11 范圍本文件規(guī)定了書寫程序代碼時(shí)的一般規(guī)則和要求。本文件適用于研發(fā)中心監(jiān)控硬件室的嵌入式程序開發(fā)過程。2 原則2.1 目的為了統(tǒng)一在項(xiàng)目開發(fā)中的程序編碼風(fēng)格,提高代碼的編寫質(zhì)量和可重用性,使代碼具有如下的特點(diǎn):可移植性,一致性,易維護(hù)性,易理解性,整潔、簡樸和清晰。2.2 基本原則1) 書寫的所有C語言代碼應(yīng)遵守ANSI C規(guī)范。2) 保持代碼簡潔。3) 語言描述直接、清晰。4) 風(fēng)格要保持一致。5) 要避免語句復(fù)雜。6) 慎重使用GOTO語句。7) 及時(shí)更新舊代碼。8) 注釋要通俗易懂,不產(chǎn)生歧義。3 源文件3.1 注意代碼行的寬度代碼行的寬度不可太
2、長,以避免代碼在顯示器上顯示時(shí)和被打印出來后的清單不便閱讀。較長的語句要分成多行書寫,劃分出的新行要進(jìn)行適當(dāng)?shù)目s進(jìn),使排版整齊,語句易讀。如果能夠做到:“長表達(dá)式在低優(yōu)先級(jí)操作符處劃分新行,操作符放在新行之首”,就最好。3.2 關(guān)于制表符(TAB)因?yàn)門AB符(ASCII碼為0x09)在不同的計(jì)算機(jī)和打印機(jī)上所表現(xiàn)的可能不同,使得維護(hù)不便。要使用合適數(shù)量的空格符(ASCII碼為0x20)代替TAB來對(duì)齊文字。3.3 使用4個(gè)空格的縮進(jìn)方式程序塊要采用縮進(jìn)風(fēng)格編寫,縮進(jìn)的空格數(shù)為4,縮進(jìn)只使用空格鍵,不用TAB鍵。3.4 程序塊的分界符程序塊的分界符(大括號(hào)“”和“”)應(yīng)各獨(dú)占一行并且位于同一列
3、,同時(shí)與引用它們的語句左對(duì)齊。在函數(shù)體的開始、結(jié)構(gòu)體的定義、聯(lián)合體的定義、枚舉的定義以及if、for、do、while、switch、case語句中的程序都要采用如上的縮進(jìn)方式。3.5 關(guān)于文件頭和函數(shù)頭部的注釋源文件(包括說明性如:頭文件.h文件、.inc文件、.def文件、編譯說明文件.cfg等)頭部應(yīng)放置注釋文字,注釋必須列出:版權(quán)說明、版本號(hào)、完成日期、作者、內(nèi)容、模塊目的/功能、主要函數(shù)及其功能、與其它文件的關(guān)系、修改日志等,頭文件的注釋中還應(yīng)有函數(shù)功能簡要說明。函數(shù)頭部也應(yīng)進(jìn)行注釋,注釋時(shí)要列出:函數(shù)名、函數(shù)的目的/功能、輸入?yún)?shù)、輸出參數(shù)、返回值、調(diào)用關(guān)系(函數(shù)、表)等(必要時(shí)要
4、舉例說明函數(shù)的使用方法)。3.6 文件書寫的層次實(shí)現(xiàn)文件(.C文件)的層次:File headingRevision history#include#define constantsMacrosLocal data typesLocal variablesLocal tablesLocal function prototypesGlobal functionsLocal functions聲明文件(.H文件)的層次:File headingRevision history#define constantsGlobal macrosGlobal data typesGlobal variable
5、sExternalsGlobal function prototypes3.7 用注釋將各個(gè)主要段分隔使用如下的方式分隔:/* Data Types*/typedef unsigned char BOOLEAN;/* Prototypes*/BOOLEAN TaskRdy(void);空行起著分隔程序段落的作用,空行得體(不過多也不過少)將使程序的布局更加清晰。3.8 必須要采取一定的措施防止頭文件被重復(fù)引用比如在使用HIWARE的HI-CROSS+編譯器時(shí)可以使用如下的方法:#ifndef _MAIN_H#define _MAIN_H Body of the header file.#end
6、if3.9 使用#include用#include filename.h格式來引用標(biāo)準(zhǔn)庫的頭文件(編譯器將從標(biāo)準(zhǔn)庫目錄開始搜索),用#include “filename.h”格式來引用非標(biāo)準(zhǔn)庫的頭文件(編譯器將從用戶的工作目錄開始搜索)。4 注釋4.1 原則上使用中文注釋。4.2 使每行注釋都有其價(jià)值一般情況下,源程序有效注釋量必須在20以上。寫注釋時(shí)要明智些!如果一段代碼的邏輯關(guān)系很復(fù)雜,注解將有助于別人理解代碼的意圖。但如果邏輯關(guān)系直線向前,避免加上并非必須的注解。注釋使用的語句要簡潔,表達(dá)要清晰、準(zhǔn)確,不要使人產(chǎn)生歧義,不可喧賓奪主。4.3 分開注釋和代碼,而不要混在一起。以免閱讀代碼時(shí)
7、注意力被分散盡可能少的在代碼語句中嵌入注釋,不要象下面的例子中的那樣。void ClkUpdateTime (void) /* DO NOT comment like this! */ /* Update the seconds */ if (ClkSec = CLK_MAX_SEC) ClkSec = 0; /* Update the minutes */ if (ClkMin = CLK_MAX_MIN) ClkMin = 0; /* Update the hours */ if (ClkHour = CLK_MAX_HOURS) ClkHour = 0; else ClkHour+; e
8、lse ClkMin+; else ClkSec+; 4.4 注釋要醒目,要使其易于同代碼區(qū)分出來不要象下面的例子中的那樣。/* This type of comment can lead to confusion especially when describing a function like ClkUpdateTime (). The function looks like actual code! */4.5 盡可能將注釋放在語句尾部,并且對(duì)齊注釋。4.6 使用合適的方法來屏蔽暫時(shí)不執(zhí)行的代碼塊可以使用如下的方法來屏蔽暫時(shí)不執(zhí)行的代碼塊,而不要修改注釋。#if 0 /* Commen
9、ts out the following code */#define DISP_TBL_SIZE 5 /* Size of display buffer table */#define DISP_MAX_X 80 /* Max. number of characters in X axis */#define DISP_MAX_Y 25 /* Max. number of characters in Y axis */#define DISP_MASK 0x5F#endif5 命名規(guī)則5.1 總約定直觀且可以拼讀,可望文知義。標(biāo)識(shí)符最好采用英文單詞或其組合,便于記憶和閱讀。切忌使用漢語拼音來
10、命名。#define constants:#define macros:typedefs:enum tags:所有的字母都用大寫形式;標(biāo)識(shí)符中的各個(gè)單詞之間用下劃線分開;Examples: DISP_BUF_SIZE, MIN(), MAX(), etc.Local variables (i.e. function scope):所有的字母都用小寫形式;標(biāo)識(shí)符中的各個(gè)單詞之間用下劃線分開;Use standard names (e.g. i, j, k用來作循環(huán)變量, p作指針變量等)File scope variables:用模塊名稱作前綴并使用下劃線與后面分開;標(biāo)識(shí)符中的各個(gè)單詞之間用首字
11、母大寫的方法來分隔開;要定義為靜態(tài);Examples: Disp_Buf, Comm_Ch, etc.Global variables:用模塊名稱作前綴;標(biāo)識(shí)符中的各個(gè)單詞之間用首字母大寫的方法來分隔開;Examples: DispMapTbl, CommErrCtr, etc.Local functions:用模塊名稱作前綴并使用下劃線與后面分開;標(biāo)識(shí)符中的各個(gè)單詞之間用首字母大寫的方法來分隔開;要定義為靜態(tài);Example: static void Comm_PutChar()Global functions:用模塊名稱作前綴;標(biāo)識(shí)符中的各個(gè)單詞之間用首字母大寫的方法來分隔開;Exampl
12、e: void CommInit()5.2 宏和自定義的數(shù)據(jù)類型,所有的字母都用大寫形式。5.3 盡量避免局部變量與全局變量同名,如果必須同名一定要使用注釋來說明。不要出現(xiàn)僅靠大小寫區(qū)分的相似的標(biāo)識(shí)符。5.4 用大寫首字母的方式來分開名字中的幾個(gè)詞。5.5 使用公認(rèn)的縮寫(包括國際通用和項(xiàng)目專用的)經(jīng)常用到的程序術(shù)語約定表可見附錄。5.6 在命名時(shí)使用“模塊名-對(duì)象-動(dòng)作”、“形容詞-名詞”或“名詞”的格式。6 關(guān)于數(shù)據(jù)類型6.1 所有的自定義數(shù)據(jù)類型都應(yīng)該使用大寫字母標(biāo)識(shí)符中的各個(gè)單詞之間用首字母大寫的方法來分隔開。6.2 使之便于移植可以采用如下的方法:typedef unsigned c
13、har BOOLEAN; /* Logical data type (TRUE or FALSE) */typedef unsigned char INT8U; /* Unsigned 8 bit value */typedef signed char INT8S; /* Signed 8 bit value */typedef unsigned short INT16U; /* Unsigned 16 bit value */typedef signed short INT16S; /* Signed 16 bit value */typedef signed short INT32U; /
14、* Unsigned 32 bit value */typedef signed short INT32S; /* Signed 32 bit value */typedef signed short INT64U; /* Unsigned 64 bit value (if available)*/typedef signed short INT64S; /* Signed 64 bit value (if available)*/typedef float FP32; /* 32 bit, single prec. floating-point */typedef double FP64;
15、/* 64 bit, double prec. floating-point */6.3 數(shù)據(jù)作用范圍如果數(shù)據(jù)只在執(zhí)行文件(.C文件)中使用,就一定要定義在此執(zhí)行文件中。如果是全局變量,就一定要定義在頭文件(.H文件)中。7 層次7.1 每行只寫一條語句。如:DispSegTblIx = 0;DispDigMsk = 0x80;而不是:DispSegTblIx = 0; DispDigMsk = 0x80;7.2 關(guān)于空格7.2.1 函數(shù)參數(shù)列表中的逗號(hào)之后要有一個(gè)空格。如下所示:DispStr(x, y, s);7.2.2 分號(hào)之后要有一個(gè)空格。如下所示:for (i = 0; i 0 ?
16、n : -n;a = 27.2.5 下面的這些操作不要加空格:操作內(nèi)容舉 例- 結(jié)構(gòu)指針p-member. 成員引用s.member 數(shù)組下標(biāo)ai7.3 函數(shù)調(diào)用語句函數(shù)調(diào)用語句中,在函數(shù)名和圓括號(hào)之間不要放空格。如下所示:DispInit();7.4 關(guān)鍵詞在if、while、for、switch和return后跟隨著放一個(gè)空格。如下所示:if (a b)while (x 0)for (i = 0; i 10; i+)switch (x)return (y);case后的語句要縮進(jìn)5個(gè)空格。如下所示:case KEY_CR: *p = NUL; break;case KEY_LINE_FEE
17、D: p+; break;7.5 等號(hào)相連多個(gè)用等號(hào)賦值的語句時(shí),上下要的等號(hào)和右邊的數(shù)字或標(biāo)識(shí)符要對(duì)齊。如下所示:DispSegTblIx = 0;DispDigMsk = 0x80;DispScale = 1.25;7.6 關(guān)于圓括號(hào)在括號(hào)括住的內(nèi)容與括號(hào)之間不要有空格。如下所示:x = (a + b) * c;8 函數(shù)8.1 一定要定義函數(shù)的返回類型,不要省略返回值的類型。8.2 在函數(shù)內(nèi)局部變量定義和代碼之間空兩行。8.3 書寫時(shí),在函數(shù)名的后面與定義函數(shù)參數(shù)的圓括號(hào)之間放一個(gè)空格。這樣可以在方便地查找函數(shù)定義,而不會(huì)受函數(shù)調(diào)用語句的影響(在調(diào)用函數(shù)時(shí)不要放這樣的空格)。8.4 不要在
18、定義局部變量的同時(shí)給其賦初值,而是分成兩條語句。8.5 如果參數(shù)是指針,且僅作輸入用,則應(yīng)在類型前加const,以防止該指針在函數(shù)體內(nèi)被意外修改。8.6 在函數(shù)體的“入口”處對(duì)參數(shù)的有效性進(jìn)行檢查。9 表達(dá)式和基本語句9.1 如果代碼中的運(yùn)算符比較多,就要使用圓括號(hào)來明確表達(dá)式的操作順序,避免使用默認(rèn)的優(yōu)先級(jí),以防止產(chǎn)生歧義并提高可讀性。9.2 必要編寫太復(fù)雜的復(fù)合表達(dá)式。不要有多用途的復(fù)合表達(dá)式。9.3 不可將浮點(diǎn)變量用“= =”或“!=”與任何數(shù)字比較。9.4 循環(huán)體內(nèi)工作量最小化。9.5 在多重循環(huán)中,如果有可能,應(yīng)當(dāng)將最長的循環(huán)放在最內(nèi)層,最短的循環(huán)放在最外層,以減少CPU跨切循環(huán)層的
19、次數(shù)。如下所示:效率低:長循環(huán)在最外層效率高:長循環(huán)在最內(nèi)層for (row=0; row100; row+)for (col=0; col5; col+) sum = sum + arowcol;for (col=0; col5; col+)for (row=0; row100; row+) sum = sum + arowcol;9.6 如果循環(huán)體內(nèi)存在邏輯判斷,并且循環(huán)次數(shù)很大,宜將邏輯判斷移到循環(huán)體的外面。如下所示:效率低但程序簡潔效率高但程序不簡潔for (i=0; iN; i+)if (condition) DoSomething();else DoOtherthing();if
20、(condition)for (i=0; iN; i+) DoSomething();elsefor (i=0; iN; i+) DoOtherthing();9.7 在for循環(huán)體內(nèi)修改循環(huán)變量時(shí)要慎重,防止for循環(huán)失去控制。9.8 建議for語句的循環(huán)控制變量的取值采用“半開半閉區(qū)間”寫法。9.9 對(duì)于switch語句下的每個(gè)case語句結(jié)尾,不要忘記加break。如果因?yàn)樘厥馇闆r需要處理完一個(gè)case后進(jìn)入下一個(gè)case處理,必須在該case語句處理完、下一個(gè)case語句前加上明確的注釋,以避免產(chǎn)生誤解,誤認(rèn)為漏寫“break”。9.10 對(duì)switch語句必須有default分支。10 其它系統(tǒng)運(yùn)行之初,要初始化有關(guān)變量及運(yùn)行環(huán)境,防止未經(jīng)初始化的變量被引用。變量的定義集中放在一起。代碼中盡量不用具體的大小數(shù)字。而是應(yīng)使用宏定義代替數(shù)字,便于以后維護(hù)。與硬件相關(guān)和與編譯器、處理器有關(guān)的操作(如:開/關(guān)中斷、驅(qū)動(dòng)輸出引腳、內(nèi)部定時(shí)等操作),建議定義成宏,便于今后維護(hù)和移植。仔細(xì)定義并明確全局變量的含義、作用、取值范圍及全局變量間的關(guān)系。去掉沒必要的全局變量。當(dāng)心數(shù)據(jù)類型轉(zhuǎn)換發(fā)生錯(cuò)誤。盡量使用顯式的數(shù)據(jù)類型轉(zhuǎn)換(讓人知道發(fā)生了什么事),避免讓編譯器靜悄悄地
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年國內(nèi)保理業(yè)務(wù)協(xié)議應(yīng)收賬款池融資版
- 一年級(jí)下數(shù)學(xué)教案-退位減法-西師大版
- 2024-2025學(xué)年一年級(jí)下學(xué)期數(shù)學(xué)第二單元位置《左和右》(教案)
- 2025年公司和個(gè)人簽訂的勞務(wù)合同模板
- 六年級(jí)上冊(cè)數(shù)學(xué)教案-4.1 比的基本性質(zhì) ︳青島版
- 一年級(jí)下冊(cè)數(shù)學(xué)教案-小兔請(qǐng)客1 北師大版
- 2025年倉儲(chǔ)保管合同樣本常用版
- 學(xué)習(xí)2025年雷鋒精神62周年主題活動(dòng)方案 (3份)
- 2025年合肥經(jīng)濟(jì)技術(shù)職業(yè)學(xué)院單招職業(yè)適應(yīng)性測試題庫完整
- 期中(試題)-外研版(三起)英語三年級(jí)下冊(cè)-(含答案)
- 《魅力教師的修煉》讀書心得體會(huì)4篇
- 2016年百貨商城商場超市企劃全年活動(dòng)策劃方案模板
- 民航法規(guī)與實(shí)務(wù)PPT全套教學(xué)課件
- 15 分章專項(xiàng)練習(xí)-整本書閱讀系列《經(jīng)典常談》名著閱讀與練習(xí)
- 幼兒園衛(wèi)生保健人員任命書(保健醫(yī)生)
- 一課一練┃二年級(jí)下冊(cè):1古詩二首
- 財(cái)務(wù)報(bào)表2019新版-已執(zhí)行新金融和收入準(zhǔn)則(財(cái)會(huì)〔2019〕6號(hào))
- 2023年湖南食品藥品職業(yè)學(xué)院高職單招(英語)試題庫含答案解析
- GB/T 39096-2020石油天然氣工業(yè)油氣井油管用鋁合金管
- 爐外精煉說課
- 紅色喜慶大氣軍令狀2022頒獎(jiǎng)誓師大會(huì)動(dòng)態(tài)PPT模板
評(píng)論
0/150
提交評(píng)論