C C++語言編程規(guī)范.doc_第1頁
C C++語言編程規(guī)范.doc_第2頁
C C++語言編程規(guī)范.doc_第3頁
C C++語言編程規(guī)范.doc_第4頁
C C++語言編程規(guī)范.doc_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

C、C+語言編程規(guī)范一目的 良好的編程風(fēng)格是提高程序可靠性非常重要的手段,也是大型項(xiàng)目多人合作開發(fā)的技術(shù)基礎(chǔ)。為了提高C/C+源程序的質(zhì)量和可維護(hù)性,通過本規(guī)范定義來避免不好的編程風(fēng)格,增強(qiáng)程序的易讀性,便于自己及他人閱讀。本規(guī)范的內(nèi)容包括:排版、注釋、標(biāo)識符命名、可讀性、變量、結(jié)構(gòu)、函數(shù)、過程、可測性、質(zhì)量保證等。二排版1、相對獨(dú)立的程序塊之間要加空行分隔,在每個類聲明之后、每個函數(shù)定義結(jié)束之后都要加空行,變量聲明與執(zhí)行代碼之間加空行分隔(C+代碼中變量聲明與使用合在一起的可不加空行)。2、函數(shù)或過程的開始、類或結(jié)構(gòu)的定義、枚舉的定義及循環(huán)、判斷等語句中以及折行的代碼都要采用縮進(jìn)風(fēng)格。每次縮進(jìn)一個制表符寬度,或者縮進(jìn)2個或4個空格寬度,代碼中應(yīng)統(tǒng)一使用制表符或空格來進(jìn)行縮進(jìn),不可混用,否則在使用不同的源代碼閱讀工具時制表符將因?yàn)橛脩粼O(shè)置的不同而擴(kuò)展為不同的寬度,造成顯示混亂。制表符具有占用字節(jié)少、易定位、不容易錯位(使用空格縮進(jìn)容易出現(xiàn)多一個或少一個空格的現(xiàn)象,看上去不明顯,但卻是錯位的)、擴(kuò)展寬度可設(shè)置的優(yōu)點(diǎn),推薦使用。3、較長的語句(80字符,或以編輯屏幕可見范圍為準(zhǔn))要分成多行書寫(折行),長表達(dá)式要在低優(yōu)先級操作符處劃分新行,操作符放在新行之首。4、循環(huán)、判斷等語句中若有較長的表達(dá)式或語句,則要進(jìn)行適應(yīng)的劃分,長表達(dá)式要在低優(yōu)先級操作符處劃分新行,操作符放在新行之首。5、若函數(shù)或過程中的參數(shù)列表較長,則要進(jìn)行適當(dāng)?shù)膭澐帧?、特殊情況下,長代碼的折行可采用靈活的方式,宗旨是使代碼易讀。7、劃分出的新行要進(jìn)行適當(dāng)?shù)目s進(jìn),以便識別。將一行代碼劃分為多行時,劃分出的新行的縮進(jìn)量要一致。8、一行代碼只做一件事情,例如只定義一個變量,或只寫一條語句,這樣的代碼容易閱讀,并且方便于寫注釋。不允許把多個短語句寫在一行中,特殊代碼(例如宏)除外。9、if、for、do、while、case、switch、default、continue、goto、extern、return、typedef等語句自占一行,且if、for、do、while等語句的執(zhí)行語句部分無論多少都要用大括號和括起來。10、C/C+語言是用大括號和界定一段程序塊的,編寫程序塊時和應(yīng)各獨(dú)占一行并且位于同一列,同時與引用它們的語句左對齊??蘸瘮?shù)或簡單的內(nèi)聯(lián)函數(shù)除外。在函數(shù)體的開始、類的定義、結(jié)構(gòu)的定義、枚舉的定義以及if、for、do、while、switch、case語句中的程序都要采用如上的縮進(jìn)方式。11、標(biāo)識符和操作符之間加適當(dāng)?shù)目崭?,使代碼錯落有致,容易閱讀。一元運(yùn)算符(+、-、求址符&、求值符*、求非值符!、求反值符、表示正負(fù)的+、-等)緊貼操作數(shù),不加空格;二元運(yùn)算符(算術(shù)運(yùn)算符+、-、*、/、%、位運(yùn)算符&、|、移位符、賦值符+=、-=、*=、/=、%=、&=、|=、=、=、比較符&、|等)與前后的操作數(shù)之間各保留一個空格;逗號、分號緊跟前面的標(biāo)識符,后面保留一個空格;類、結(jié)構(gòu)成員訪問符.、-等前后不加空格;聲明函數(shù)和單個變量時,類型修飾符&和*靠近類型名,與函數(shù)名或變量名之間留一個空格;在一條語句中聲明多個變量時,類型修飾符&和*靠近變量名,避免閱讀代碼時產(chǎn)生誤解。12、修改代碼時排版風(fēng)格應(yīng)與原代碼風(fēng)格保持一致,或者徹底修改整份代碼的風(fēng)格(代碼基線后不提倡這樣大改)。三注釋1、源程序有效注釋量必須在20%以上。注釋應(yīng)盡量采用C+的注釋風(fēng)格,即使用/ 注釋。2、在代碼的邏輯含義的層次上進(jìn)行注釋。注釋總是加在程序的需要一個概括性說明或不易理解或易理解錯的地方。注釋語言應(yīng)該簡練、易懂而又含義準(zhǔn)確,避免二義性;所采用的語種首選是中文,如有輸入困難、編譯環(huán)境限制或特殊需求也可采用英文。3、注釋應(yīng)與其描述的代碼相近,對代碼的注釋應(yīng)放在其上方或右方(針對單條語句的注釋)相鄰位置,不可放在下方,避免在一行代碼或表達(dá)式中間使用注釋,如放于上方則需與其上面的代碼用空行隔開(較緊湊的代碼除外)。4、正確命名變量、結(jié)構(gòu)、函數(shù)、過程以及合理地組織代碼地結(jié)構(gòu),使代碼成為自注釋的,可減少不必要的注釋。5、數(shù)據(jù)結(jié)構(gòu)聲明(包括數(shù)組、結(jié)構(gòu)、類、枚舉等),如果其命名不是充分自注釋的,必須加以注釋。對數(shù)據(jù)結(jié)構(gòu)的注釋應(yīng)放在其上方相鄰位置,不可放在下面;對結(jié)構(gòu)中的每個域的注釋放在此域的右方。6、在常量名字(或有宏機(jī)制的語言中的宏)聲明后應(yīng)對該名字作適當(dāng)注釋,注釋說明的要點(diǎn)是:被保存值的含義(必須);合法取值的范圍(可選)。7、函數(shù)注釋包括:函數(shù)功能描述(必須,除非函數(shù)非常簡單明了),輸入、輸出等,復(fù)雜的函數(shù)需要加上變量用途說明。8、說明文件(.h、.inc、.def、.cfg等)頭部應(yīng)進(jìn)行注釋,注釋內(nèi)容包括:作者名稱、創(chuàng)建時間、模塊用途等,復(fù)雜的算法需要加上流程說明,與其他文件有密切依賴關(guān)系的要進(jìn)行說明。9、程序中注釋包括:修改時間和作者、方便理解的注釋等。10、當(dāng)if、for等語句后的代碼塊比較長,特別是有多重嵌套時,應(yīng)當(dāng)在一些段落結(jié)束處的符號后加注釋,簡單標(biāo)明其對應(yīng)起始位置,例如/ end of if (.) 、/ end of while (.),以便閱讀。11、邊寫代碼邊注釋。代碼比較復(fù)雜時,先寫注釋標(biāo)識出程序的處理過程,然后再對每一個邏輯處理過程進(jìn)行語句書寫。修改代碼同時修改相應(yīng)的注釋,以保證注釋與代碼的一致性。不再有用的注釋要刪除。四標(biāo)識符命名1、標(biāo)識符的命名要清晰、明了,有明確含義,同時使用完整的單詞或大家基本可以理解的縮寫,避免使人產(chǎn)生誤解。命名中使用特殊約定或縮寫時,要有注釋說明。2、命名規(guī)范必須與所使用的系統(tǒng)風(fēng)格保持一致,UNIX系統(tǒng)下采用全小寫加下劃線的形式,Windows系統(tǒng)下采用大小寫混排的形式。自己特有的命名風(fēng)格,要自始至終保持一致,不可來回變化,且首先要符合項(xiàng)目組或產(chǎn)品組的命名規(guī)則。3、對于變量命名,盡量使用完整的單詞而不是縮寫;禁止取單個字符(如i、j、k.),但i、j、k作局部循環(huán)變量、p作為指針、x、y作為坐標(biāo)變量以及在數(shù)學(xué)公式中合理使用單字符變量是允許的,建議除了要有具體含義外,還能表明其變量類型、數(shù)據(jù)類型、有效范圍等(采用匈牙利命名法或簡化的匈牙利命名法)。靜態(tài)變量要加前綴s_(表示static),全局變量要加前綴g_(表示global),類的數(shù)據(jù)成員要加前綴m_(表示member),常量要加前綴c_(表示const)或使用全大寫加下劃線的形式。4、應(yīng)盡量使用const定義常量而不使用宏定義常量。5、程序中不要使用僅靠大小寫區(qū)分的相似的標(biāo)識符;也不要使用標(biāo)識符完全相同的局部變量和全局變量,盡管兩者的作用域不同而不會發(fā)生語法錯誤,但容易使人誤解。6、復(fù)用一個變量時不要出于不同的目的,因?yàn)檫@樣容易把讀代碼的人搞糊涂。7、變量的名字應(yīng)當(dāng)使用“名詞”或者“形容詞名詞”。全局函數(shù)的名字應(yīng)當(dāng)使用“動詞”、“動詞名詞”或者“動詞副詞(動詞短語)”的形式。類的成員函數(shù)(如果可以的話)應(yīng)當(dāng)只使用“動詞”,被省略掉的名詞就是類本身。8、用正確的反義詞組命名具有互斥意義的變量或相反動作的函數(shù)等。常用反義詞組有: add/delete, add/remove, begin/end, create/destroy, cut/paste, first/last, get/put, get/set, increase/decrease, increment/decrement, insert/delete, insert/remove, lock/unlock, min/max, old/new, open/close, previous/next, save/load, send/receive, set/unset, show/hide, source/destination, source/target, start/finish, start/stop, up/down。9、在Windows系統(tǒng)下編程時,類名、結(jié)構(gòu)名用首字母大寫的單詞組合而成,結(jié)構(gòu)名也可以用全大寫單詞加下劃線分隔組成。類名以大寫字母C為前綴,結(jié)構(gòu)名以Stru為后綴,以區(qū)分函數(shù)名;全大寫單詞加下劃線的結(jié)構(gòu)名要以_STRU為后綴(或使用其他能體現(xiàn)結(jié)構(gòu)含義的前/后綴),以區(qū)分全大寫單詞加下劃線組成的常量名;函數(shù)名用首字母大寫的單詞組合而成。五可讀性1、避免使用不易理解的數(shù)字,用有意義的宏或常量標(biāo)識符來替代。涉及物理狀態(tài)或者含有物理意義的常量必須用有意義的枚舉或宏來代替。被多處使用的數(shù)字應(yīng)替換為宏以便修改。2、注意運(yùn)算符的優(yōu)先級,表達(dá)式比較復(fù)雜時用括號明確表達(dá)式的操作順序,避免使用默認(rèn)優(yōu)先級讓閱讀者容易產(chǎn)生誤解。3、程序中關(guān)系較為緊密的代碼應(yīng)盡可能相鄰,結(jié)構(gòu)成員賦值代碼不應(yīng)被其它代碼隔開。不要使用難懂的技巧性很高的語句,除非很有必要。六變量、結(jié)構(gòu)1、去掉沒有必要的公共變量以降低模塊間的耦合度。定義公共變量時,應(yīng)對其含義、作用、取值范圍進(jìn)行注釋說明,若有必要還應(yīng)說明與其它變量的關(guān)系。明確公共變量與操作此變量的函數(shù)或過程的關(guān)系,如:被哪個函數(shù)訪問、修改等。對公共變量賦值應(yīng)避免不合理的值或數(shù)組下標(biāo)越界。避免局部變量與公共變量同名。2、嚴(yán)禁使用未經(jīng)初始化的變量作為右值,為避免不同的編譯器在變量初始化上的差異,對變量,尤其是指針,在使用前將其初始化,盡可能在定義變量的同時初始化該變量(就近原則)。3、使用可移植的數(shù)據(jù)類型,盡量不要使用與具體硬件或軟件環(huán)境關(guān)系密切的變量。4、結(jié)構(gòu)的功能要單一,是針對一種事務(wù)的抽象。說明:設(shè)計(jì)結(jié)構(gòu)時應(yīng)力爭使結(jié)構(gòu)代表一種現(xiàn)實(shí)事務(wù)的抽象,而不是同時代表多種。結(jié)構(gòu)中的各元素應(yīng)代表同一事務(wù)的不同側(cè)面,而不應(yīng)把描述沒有關(guān)系或關(guān)系很弱的不同事務(wù)的元素放到同一結(jié)構(gòu)中。如果兩個結(jié)構(gòu)間關(guān)系比較復(fù)雜、密切,應(yīng)將它們合并為一個結(jié)構(gòu)。5、結(jié)構(gòu)中元素的個數(shù)應(yīng)適中。若結(jié)構(gòu)中元素個數(shù)過多可考慮依據(jù)某種原則把元素組成不同的子結(jié)構(gòu),以減少原結(jié)構(gòu)中元素的個數(shù)。6、仔細(xì)設(shè)計(jì)結(jié)構(gòu)中元素的布局與排列順序,使結(jié)構(gòu)容易理解、節(jié)省占用空間(針對位域),并減少引起誤用現(xiàn)象??紤]存取效率,結(jié)構(gòu)元素盡量位于字節(jié)對齊的位置上,例如32位機(jī)上,如果結(jié)構(gòu)成員在4字節(jié)倍數(shù)的位置上,CPU一個指令就可以存取,否則要耗費(fèi)更多的CPU指令。7、結(jié)構(gòu)的設(shè)計(jì)要盡量考慮向前兼容和以后的版本升級,并為某些未來可能的應(yīng)用保留余地(如預(yù)留一些空間等)。8、對自定義數(shù)據(jù)類型進(jìn)行恰當(dāng)命名,使它成為自描述性的,以提高代碼可讀性。注意其命名方式在同一產(chǎn)品中的統(tǒng)一。9、當(dāng)聲明用于分布式環(huán)境或不同CPU間通信環(huán)境的數(shù)據(jù)結(jié)構(gòu)時,必須考慮機(jī)器的字節(jié)順序、使用的位域及字節(jié)對齊等問題。10、定義結(jié)構(gòu)體成員變量應(yīng)盡量使用基本的數(shù)據(jù)類型,如果使用結(jié)構(gòu)體、類或指針為成員變量,應(yīng)定義執(zhí)行初始化的構(gòu)造函數(shù)、拷貝構(gòu)造函數(shù)和重載賦值操作符。聲明不能自行初始化的結(jié)構(gòu)或類的變量時,應(yīng)及時初始化該變量。11、定義以行為為主的類時,將public函數(shù)、方法聲明寫在前面,將private數(shù)據(jù)聲明寫在后面;定義以數(shù)據(jù)為主的結(jié)構(gòu)體時,將數(shù)據(jù)聲明寫在前面,將輔助函數(shù)(執(zhí)行初始化的構(gòu)造函數(shù)、拷貝構(gòu)造函數(shù)、賦值函數(shù)等)寫在后面。12、在類和結(jié)構(gòu)聲明中,復(fù)用public、protected、private關(guān)鍵字,將函數(shù)聲明和成員變量聲明分開。七函數(shù)、過程1、對所調(diào)用函數(shù)的錯誤返回碼要仔細(xì)、全面地處理。2、編寫可重入函數(shù)時,應(yīng)注意局部變量的使用(例如編寫C/C+語言的可重入函數(shù)時,應(yīng)使用auto即缺省態(tài)局部變量或寄存器變量)。說明:編寫C/C+語言的可重入函數(shù)時,不應(yīng)使用static局部變量,否則必須經(jīng)過特殊處理,才能使函數(shù)具有可重入性。3、編寫可重入函數(shù)時,若使用全局變量,則應(yīng)通過設(shè)置互斥量、關(guān)中斷、信號量(即P、V操作)等手段對其加以保護(hù)。4、在同一項(xiàng)目組應(yīng)明確規(guī)定對接口函數(shù)參數(shù)的合法性檢查應(yīng)由函數(shù)的調(diào)用者負(fù)責(zé)還是由接口函數(shù)本身負(fù)責(zé),缺省是由函數(shù)調(diào)用者負(fù)責(zé)。說明:對于模塊間接口函數(shù)的參數(shù)的合法性檢查這一問題,往往有兩個極端現(xiàn)象,要么是調(diào)用者和被調(diào)用者對參數(shù)均不作合法性檢查,結(jié)果就遺漏了合法性檢查這一必要的處理過程,造成問題隱患;要么就是調(diào)用者和被調(diào)用者均對參數(shù)進(jìn)行合法性檢查,這種情況雖不會造成問題,但產(chǎn)生了冗余代碼,降低了效率。5、函數(shù)的規(guī)模盡量限制在200行以內(nèi),一個函數(shù)僅完成一件功能,為簡單功能編寫函數(shù),不要設(shè)計(jì)多用途面面俱到的函數(shù)。6、函數(shù)的功能應(yīng)該是可以預(yù)測的,也就是只要輸入的數(shù)據(jù)相同就應(yīng)產(chǎn)生同樣的輸出。7、如果多段代碼重復(fù)做同一件事情,應(yīng)考慮函數(shù)重構(gòu)。8、設(shè)計(jì)高扇入、合理扇出(小于7)的函數(shù),改進(jìn)模塊中函數(shù)的結(jié)構(gòu),降低函數(shù)間的耦合度,并提高函數(shù)的獨(dú)立性以及代碼可讀性、效率和可維護(hù)性。9、在多任務(wù)操作系統(tǒng)的環(huán)境下編程,要注意函數(shù)可重入性的考慮。10、為了防止頭文件被重復(fù)包含,應(yīng)當(dāng)用#include guards(#ifndef xx_h / #define xx_h / #endif)結(jié)構(gòu)產(chǎn)生預(yù)處理塊。#include應(yīng)一律出現(xiàn)在文件開頭, 如果是頭文件則放在#include guards之后。盡量避免頭文件對頭文件的依賴,如果某個頭文件中需要用到某個類的引用或指針,那么只需要一個forward declaration(例如class CMyClass;)就足夠了。源程序應(yīng)該首先#include對應(yīng)的頭文件 確保每個頭文件都可以單獨(dú)被include,而不需要額外的頭文件依賴。11、使用宏定義表達(dá)式時,要使用完備的括號。將宏定義的多條表達(dá)式放在大括號中,避免if、for等語句書寫不規(guī)范造成代碼漏執(zhí)行。使用宏時,避免執(zhí)行使參數(shù)值發(fā)生變化的操作,例如增1操作。12、在主要的函數(shù)和過程的入口、出口及大的分支記錄最低級別(DEBUGGING)的調(diào)試日志;在模塊間互發(fā)消息時,發(fā)送方和接受方都要記錄信息級別(INFORMATION)的日志;在調(diào)用系統(tǒng)函數(shù)發(fā)生錯誤處記錄錯誤級別(ERROR)的日志;在與程序性能關(guān)系密切的函數(shù)調(diào)用處記錄性能日志;進(jìn)行多線程編程時在日志中記錄線程ID以便定位錯誤。八可測性1、在同一項(xiàng)目組或產(chǎn)品組內(nèi),調(diào)測打印出的信息串的格式要有統(tǒng)一的形式。信息串中至少要有所在模塊名(或源文件名)及行號。2、使用斷言來發(fā)現(xiàn)軟件問題,提高代碼可測性,用斷言確認(rèn)函數(shù)的參數(shù)的有效性。九質(zhì)量保證1、代碼質(zhì)量保證優(yōu)先原則: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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論