CC編碼規(guī)范(學習模板)_第1頁
CC編碼規(guī)范(學習模板)_第2頁
CC編碼規(guī)范(學習模板)_第3頁
CC編碼規(guī)范(學習模板)_第4頁
CC編碼規(guī)范(學習模板)_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

C&C++編碼規(guī)范

目錄1編寫目的 12程序版式 12.1基本排版說明 12.1.1空行 12.1.2代碼行 12.1.3代碼行內(nèi)的空格 12.1.4縮進對齊 22.1.5長行拆分 22.1.6修飾符 22.1.7類 22.2源文件格式 22.2.1文件頭 32.2.2頭文件的結(jié)構(gòu) 32.2.3定義文件的結(jié)構(gòu) 42.3注釋和說明 42.3.1注釋一般風格 52.3.2文件開頭注釋 52.3.3變量注釋 52.3.4函數(shù)注釋 52.3.5程序塊注釋 63命名規(guī)則 63.1共性規(guī)則 63.2宏(#define) 73.3類型定義(#typedef) 73.4變量 83.5結(jié)構(gòu) 83.6函數(shù) 83.7常量 83.8類中的常量 94表達式和基本語句 104.1運算符的優(yōu)先級 104.2復合表達式 104.3 if語句寫法 104.4 for語句寫法 114.5 while語句寫法 114.6 switch語句寫法 114.7 goto語句寫法 115 函數(shù)和過程 125.1命名規(guī)則 125.2函數(shù)輸入 125.3 函數(shù)輸出 135.4 函數(shù)返回值 136 基于性能和優(yōu)化的其他建議 131編寫目的為規(guī)范開發(fā)過程,在項目組中統(tǒng)一代碼風格,提高代碼質(zhì)量,增加后續(xù)代碼的易讀性和可維護性,特編寫此文檔。2程序版式版式雖然不會影響程序的功能,但會影響可讀性。程序的版式追求清晰、美觀,是程序風格的重要構(gòu)成因素。2.1基本排版說明2.1.1空行空行起著分隔程序段落的作用??招械皿w(不過多也不過少)將使程序的布更加清晰??招胁粫速M內(nèi)存,雖然打印含有空行的程序是會多消耗一些紙,但是值得。所以不要舍不得用空行。在每個類聲明之后、每個函數(shù)定義結(jié)束之后都要加空行。在一個函數(shù)體內(nèi),邏揖上密切相關(guān)的語句之間不加空行,其它地方應(yīng)加空行分隔。2.1.2代碼行一行代碼只做一件事情,如只定義一個變量,或只寫一條語句。這樣的代碼容易閱讀,并且方便于寫注釋。if、for、while、do等語句自占一行,執(zhí)行語句不得緊跟其后。不論執(zhí)行語句有多少都要加{}。這樣可以防止書寫失誤。2.1.3代碼行內(nèi)的空格函數(shù)名和關(guān)鍵字緊跟左括號‘(’,之后不要留空格。‘(’向后緊跟,‘)’、‘,’、‘;’向前緊跟,緊跟處不留空格;‘,’之后要留空格,如Function(x,y,z)。如果‘;’不是一行的結(jié)束符號,其后要留空格,如for(initialization;condition;update)。賦值操作符、比較操作符、算術(shù)操作符、邏輯操作符、位域操作符,如“=”、“+=”“>=”、“<=”、“+”、“*”、“%”、“&&”、“||”、“<<”,“^”等二元操作符的前后應(yīng)當加空格。一元操作符如“!”、“~”、“++”、“--”、“&”(地址運算符)等前后不加空格;“[]”、“.”、“->”這類操作符前后不加空格。對于表達式比較長的for語句和if語句,為了緊湊起見可以適當?shù)厝サ粢恍┛崭?,如for(i=0;i<10;i++)和if((a<=b)&&(c<=d))2.1.4縮進對齊程序的分界符‘{’和‘}’應(yīng)獨占一行并且位于同一列,同時與引用它們的語句左對齊;{}之內(nèi)的代碼塊在‘{’右邊縮進對齊。相鄰層次間的語句縮進長度為4個空格。在編輯器允許的情況下,建議將tab鍵的寬度定義為4個字符寬,而一tab鍵縮進。2.1.5長行拆分代碼行最大長度宜控制在70至80個字符以內(nèi)。代碼行不要過長,否則眼睛看不過來,也不便于打印。另外,多于80字符的行不能被一些終端或工具很好的處理。長表達式的斷行原則:要在逗號后斷行;要在操作符前斷行;要在低優(yōu)先級操作符處拆分成新行;在新行續(xù)表達式時,要和上一行的同一級對齊。如果上面的規(guī)則導致代碼混亂或者把代碼壓出了右邊界,那么只縮進8個空格即可??s進的原則是使排版整齊,語句可讀。if、for、while語句斷行時通常應(yīng)當用8個空格,因為常規(guī)縮進(4個空格)難以看清語句體。2.1.6修飾符應(yīng)當將修飾符*和&緊靠變量名。2.1.7類顯式說明private限定符。將public類型的函數(shù)寫在前面,而將private類型的數(shù)據(jù)寫在后面,重點關(guān)注的是類應(yīng)該提供什么樣的接口(或服務(wù))。2.2源文件格式每個C++/C程序通常分為兩個文件。一個文件用于保存程序的聲明(declaration),稱為頭文件。另一個文件用于保存程序的實現(xiàn)(implementation),稱為定義(definition)文件。C++/C程序的頭文件以“.h”為后綴(或以.hxx、.hpp為后綴),C程序的定義文件以“.c”為后綴,C++程序的定義文件通常以“.cpp”為后綴(也有一些系統(tǒng)以“.cc”或“.cxx”為后綴)。一個文件通常由多節(jié)(sections)組成,節(jié)與節(jié)之間應(yīng)以空行隔開,且每節(jié)都應(yīng)有相應(yīng)的注釋來標識。盡量避免一個文件超過2000行。文件命名應(yīng)盡可能反映文件實現(xiàn)的功能。2.2.1文件頭文件頭主要是版權(quán)和版本的聲明,一般存在于在頭文件和定義文件的開頭,主要內(nèi)容有:版權(quán)信息。文件名稱,標識符,摘要。當前版本號,作者/修改者,完成日期。版本歷史信息。舉例如下:/*/**Copyright(c)2010,××××××××有限公司*Allrightsreserved.**文件名稱:file.h*摘要:簡要描述本文件的內(nèi)容**當前版本:1.1*作者:輸入作者(或修改者)名字*完成日期:2010年7月20日**[取代版本:1.0*原作者:輸入原作者(或修改者)名字*完成日期:2009年7月20日]**修訂記錄:*修訂日期修訂人修訂內(nèi)容*2010年7月20日程序員姓名修改文件說明**/2.2.2頭文件的結(jié)構(gòu)頭文件由三部分內(nèi)容組成:頭文件開頭處的版權(quán)和版本聲明。預處理塊。函數(shù)和類結(jié)構(gòu)、接口聲明等。為了防止頭文件被重復引用,應(yīng)當用ifndef/define/endif結(jié)構(gòu)產(chǎn)生預處理塊。宏定義的變量名以一個(或者兩個)下劃線打頭、并以一個(或者兩個)下劃線結(jié)尾,中間將頭文件名的“.”替換為一個下劃線組成。用#include<filename.h>格式來引用標準庫的頭文件(編譯器將從標準庫目錄開始搜索);用#include“filename.h”格式來引用非標準庫的頭文件(編譯器將從用戶的工作目錄開始搜索)。頭文件中只存放“聲明”而不存放“定義”。在C++語法中,類的成員函數(shù)可以在聲明的同時被定義,并且自動成為內(nèi)聯(lián)函數(shù)。這雖然會帶來書寫上的方便,但卻造成了風格不一致,弊大于利。建議將成員函數(shù)的定義與聲明分開,不論該函數(shù)體有多么小。不提倡使用全變量,盡量不要在頭文件中出現(xiàn)象externintvalue這類聲明。2.2.3定義文件的結(jié)構(gòu)定義文件有三部分內(nèi)容定義文件開頭處的版權(quán)和版本聲明。對一些頭文件的引用。程序的實現(xiàn)體(包括數(shù)據(jù)和代碼)。2.3注釋和說明程序通常有兩種類型的注釋:實現(xiàn)注釋和文檔注釋。實現(xiàn)注釋以/*...*/和//標志(僅對C++有效)。文檔注釋以/*...*/標志,通過在程序中加文檔注釋,便于通過各類工具將文檔注釋從程序中提取出來形成HTML文檔,作為程序接口描述文檔。實現(xiàn)注釋主要用來對代碼的具體實現(xiàn)進行描述;而文檔注釋用來從實現(xiàn)透明的角度描述代碼的規(guī)格,以便開發(fā)者了解和使用該代碼時無須把源代碼放在手邊或詳細研讀實現(xiàn)代碼。注釋應(yīng)對代碼進行概括總結(jié)并提供從代碼本身無法直接看出的附加信息。注釋中應(yīng)只包括與閱讀、理解程序相關(guān)的信息。例如,如何生成相應(yīng)的包或它本身放在什么目錄下等信息不應(yīng)當包括在注釋中。在寫注釋時,要說明有價值的或無法明顯看出的信息,盡量避免重復那些呈現(xiàn)在代碼中的明顯信息。2.3.1注釋一般風格修改代碼中要加入修改內(nèi)容、修改人、修改時間注釋的位置應(yīng)與被描述的代碼相鄰,可以放在代碼的上方或右方,不可放在下方注釋是對代碼的“提示”,而不是文檔。程序中的注釋不可喧賓奪主,注釋太多了會讓人眼花繚亂。注釋的花樣要少。邊寫代碼邊注釋,注釋量不少于20%;修改代碼同時修改相應(yīng)的注釋,以保證注釋與代碼的一致性。不再有用的注釋要刪除。注釋應(yīng)當準確、易懂,防止注釋有二義性。盡量避免在注釋中使用縮寫,特別是不常用縮寫。2.3.2文件開頭注釋文件開頭注釋即版本和版權(quán)聲明,見上。2.3.3變量注釋對于所有有物理含義的變量、常量,如果其命名不是充分自注釋的,在聲明時都必須加以注釋,說明其物理含義如果代碼本來就是清楚的,則不必加注釋。否則多此一舉,令人厭煩。如:i++; //i加1,多余的注釋2.3.4函數(shù)注釋每個函數(shù)定義的時候都必須有對應(yīng)的注釋,包含但不限于以下內(nèi)容:功能描述輸入?yún)?shù)輸出參數(shù)返回值函數(shù)注釋格式如下:/*/***功能描述:*輸入?yún)?shù):*輸出參數(shù):*返回值:*/函數(shù)的注釋內(nèi)容可以擴充,但在一個項目中格式應(yīng)該統(tǒng)一。2.3.5程序塊注釋程序塊的注釋采用/*…*/。當代碼比較長,特別是有多重嵌套(if、for等)時,應(yīng)當在一些段落的結(jié)束處加注釋。3命名規(guī)則命名應(yīng)具有描述性,即命名可描述被描述對象的功能、作用等。命名應(yīng)使用標準的英文單詞(包括縮寫)或完整的漢語拼音。使用英文單詞時應(yīng)注意使用較常用且含義較明確的詞,而不要使用含義不清或容易引起混淆的詞。某些詞因用途較廣而導致含義不清,如treat、data、system等。某些詞因在業(yè)內(nèi)已有特定含義而導致易產(chǎn)生誤解,如windows、socket等。使用以上類型的詞時應(yīng)特別注意,應(yīng)保證該詞在項目中有明確的含義。不要使用較冷僻的詞。如該單詞屬于與某行業(yè)相關(guān)的專業(yè)術(shù)語,應(yīng)保證其在項目中有明確定義后再使用,或直接使用漢語拼音。除已被公認的縮寫方式(如sys、num等)外,不要使用縮寫。對于項目中特定的較常用的詞,如需縮寫,應(yīng)明確定義。如果無法找到相應(yīng)的英文單詞(如純粹的中文名稱)或相應(yīng)的英文單詞較冷僻,應(yīng)使用漢語拼音。使用漢語拼音時應(yīng)注意完整而準確,不要縮寫,不要因方言的影響而使用錯誤的拼音。字符的大小寫及下劃線’_’的使用:對于不同類型的命名對象,各英文單詞(或漢語拼音單字)的大小寫方式可分為如下幾種:全大寫、全小寫、英文單詞(或漢語拼音單字)的首字母大寫,下劃線應(yīng)加在英文單詞(或漢語拼音單詞之間)。3.1共性規(guī)則本節(jié)論述的共性規(guī)則是被大多數(shù)程序員采納的,我們應(yīng)當在遵循這些共性規(guī)則的前提下,再擴充特定的規(guī)則。標識符應(yīng)當直觀且可以拼讀,可望文知意,不必進行“解碼”。標識符最好采用英文單詞或其組合,便于記憶和閱讀,切忌直接使用漢語拼音來命名。標識符的長度應(yīng)當符合“min-length&&max-information”原則。程序中不要出現(xiàn)僅靠大小寫區(qū)分的相似的標識符。程序中不要出現(xiàn)標識符完全相同的部變量和全變量,盡管兩者的作用域不同而不會發(fā)生語法錯誤,但會使人誤解。變量的名字應(yīng)當使用“名詞”或者“形容詞+名詞”。全函數(shù)的名字應(yīng)當使用“動詞”或者“動詞+名詞”(動賓詞組)。類的成員函數(shù)應(yīng)當只使用“動詞”,被省略掉的名詞就是對象本身。用正確的反義詞組命名具有互斥意義的變量或相反動作的函數(shù)等。盡量避免名字中出現(xiàn)數(shù)字編號,如Value1,Value2等,除非邏輯上的確需要編號。這是為了防止程序員偷懶,不肯為命名動腦筋而導致產(chǎn)生無意義的名字(因為用數(shù)字編號最省事)。3.2宏(#define)對于常數(shù)或表達式,宏名稱應(yīng)使用名詞(或名詞性詞組)描述該常數(shù)的含義或表達式所得到的數(shù)據(jù)內(nèi)容,各單詞均應(yīng)大寫,并以下劃線分隔。如:MAX_CHAR_NUM。對于特定處理,宏名稱應(yīng)使用動詞(或動賓詞組)描述所作的處理。各單詞均大寫,但單詞間不加下劃線。如:ADDXY。用宏定義表達式時,要使用完備的括號。將宏所定義的多條表達式放在大括號中。使用宏時,不允許參數(shù)發(fā)生變化。3.3類型定義(#typedef)使用typedef定義結(jié)構(gòu),struct后使用“_”命名,結(jié)構(gòu)類型不帶下劃線。typedeftypedef struct_TIME_DATA{ charisTime[DATE_STD_LEN+1]; /*時間*/ charisYear[DATE_YEAR_LEN+1]; /*年*/ charisMon[DATE_MON_LEN+1]; /*月*/ charisDay[DATE_DAY_LEN+1]; /*日*/ charisHour[DATE_HOUR_LEN+1]; /*時*/ charisMin[DATE_MIN_LEN+1]; /*分*/ charisSec[DATE_SEC_LEN+1]; /*秒*/}TIME_DATA;3.4變量變量名應(yīng)以一個或幾個小寫字符為前綴,描述該變量的類型,一般為相應(yīng)類型的首字母或者前兩個字母,如int類型用i,char類型用ch等,后跟一個或幾個單詞描述該變量的作用,各單詞的首字母大寫。如:iItemNum。對于全變量,可在變量名前加上‘g_’,如:g_iItemNum。靜態(tài)變量加前綴s_(表示static)。應(yīng)當將修飾符*和&緊靠變量名類的數(shù)據(jù)成員加前綴m_(表示member),這樣可以避免數(shù)據(jù)成員與成員函數(shù)的參數(shù)同名。3.5結(jié)構(gòu)結(jié)構(gòu)名以tag為前綴,后跟名詞(或名詞性詞組)描述該結(jié)構(gòu)所描述的對象。結(jié)構(gòu)中定義的各變量應(yīng)描述該對象的某個屬性,其命名規(guī)則遵循變量的命名規(guī)則。3.6函數(shù)類名和函數(shù)名用大寫字母開頭的單詞組合而成。全函數(shù)名應(yīng)以動詞(或動賓詞組)描述該函數(shù)的功能,類的成員函數(shù)應(yīng)當只使用動詞。用正確的反義詞組命名具有互斥意義的變量或相反動作的函數(shù)等函數(shù)的參數(shù)名遵循變量命名規(guī)則。函數(shù)的聲明采用ANSI的新標準,即參數(shù)聲明在()內(nèi)。函數(shù)名長度通常不超過50字符。3.7常量盡量使用含義直觀的常量來表示那些將在程序中多次出現(xiàn)的數(shù)字或字符串需要對外公開的常量放在頭文件中,不需要對外公開的常量放在定義文件的頭部。為便于管理,可以把不同模塊的常量集中存放在一個公共的頭文件中。如果某一常量與其它常量密切相關(guān),應(yīng)在定義中包含這種關(guān)系,而不應(yīng)給出一些孤立的值在C++程序中只使用const常量而不使用宏常量,即const常量完全取代宏常量。注:C++語言也可以用#define來定義常量。但是使用const比使用宏常量有更多的優(yōu)點。1)const常量有數(shù)據(jù)類型,而宏常量沒有數(shù)據(jù)類型。編譯器可以對前者進行類型安全檢查。而對后者只進行字符替換,沒有類型安全檢查,并且在字符替換可能會產(chǎn)生意料不到的錯誤(邊際效應(yīng))。2)有些集成化的調(diào)試工具可以對const常量進行調(diào)試,但是不能對宏常量進行調(diào)試。3.8類中的常量有時我們希望某些常量只在類中有效。由于#define定義的宏常量是全的,不能達到目的,于是想當然地覺得應(yīng)該用const修飾數(shù)據(jù)成員來實現(xiàn)。const數(shù)據(jù)成員的確是存在的,但其含義卻不是我們所期望的。const數(shù)據(jù)成員只在某個對象生存期內(nèi)是常量,而對于整個類而言卻是可變的,因為類可以創(chuàng)建多個對象,不同的對象其const數(shù)據(jù)成員的值可以不同。不能在類聲明中初始化const數(shù)據(jù)成員。以下用法是錯誤的,因為類的對象未被創(chuàng)建時,編譯器不知道SIZE的值是什么。 classA {… constintSIZE=100; //錯誤,企圖在類聲明中初始化const數(shù)據(jù)成員 intarray[SIZE]; //錯誤,未知的SIZE };const數(shù)據(jù)成員的初始化只能在類構(gòu)造函數(shù)的初始化表中進行,例如 classA {… A(intsize); //構(gòu)造函數(shù) constintSIZE; }; A::A(intsize):SIZE(size) //構(gòu)造函數(shù)的初始化表 { … } Aa(100); //對象a的SIZE值為100 Ab(200); //對象b的SIZE值為200怎樣才能建立在整個類中都恒定的常量呢?別指望const數(shù)據(jù)成員了,應(yīng)該用類中的枚舉常量來實現(xiàn)。例如 classA {… enum{SIZE1=100,SIZE2=200};//枚舉常量 intarray1[SIZE1]; intarray2[SIZE2]; };枚舉常量不會占用對象的存儲空間,它們在編譯時被全部求值。枚舉常量的缺點是:它的隱含數(shù)據(jù)類型是整數(shù),其最大值有限,且不能表示浮點數(shù)(如PI=3.14159)。4表達式和基本語句4.1運算符的優(yōu)先級如果代碼行中的運算符比較多,用括號確定表達式的操作順序,避免使用默認的優(yōu)先級。4.2復合表達式不要編寫太復雜的復合表達式不要有多用途的復合表達式不要把程序中的復合表達式與“真正的數(shù)學表達式”混淆,例如:if(a<b<c)并不表示if((a<b)&&(b<c)),而是成了令人費解的if((a<b)<c)if語句寫法常量和變量做等于比較時,要求常量在前,變量在后,如if(2000==year)。不可將布爾變量直接與TRUE、FALSE或者1、0進行比較。應(yīng)當將整型變量用“==”或“!=”直接與0比較,不可模仿布爾變量的風格而寫成if(value)或if(!value)。不可將浮點變量用“==”或“!=”與任何數(shù)字比較,應(yīng)該設(shè)法轉(zhuǎn)化成“>=”或“<=”形式,如if((x>=-EPSINON)&&(x<=EPSINON)),其中EPSINON是允許的誤差(即精度)。應(yīng)當將指針變量用“==”或“!=”與NULL比較。if內(nèi)無論語句多少都要使用一組{},程序的分界符‘{’和‘}’應(yīng)獨占一行并且位于同一列,同時與引用它們的語句左對齊。for語句寫法循環(huán)內(nèi)無論語句多少都要使用一組{}。程序的分界符‘{’和‘}’應(yīng)獨占一行并且位于同一列,同時與引用它們的語句左對齊;嵌套的{},則使用縮進對齊。不可在for循環(huán)體內(nèi)修改循環(huán)變量,防止for循環(huán)失去控制。建議for語句的循環(huán)控制變量的取值采用“半開半閉區(qū)間”寫法。while語句寫法在多重循環(huán)中,如果有可能,應(yīng)當將最長的循環(huán)放在最內(nèi)層,最短的循環(huán)放在最外層,以減少CPU跨切循環(huán)層的次數(shù)。如果循環(huán)體內(nèi)存在邏輯判斷,并且循環(huán)次數(shù)很大,宜將邏輯判斷移到循環(huán)體的外面。合理使用空格。switch語句寫法每個case語句的結(jié)尾不要忘了加break,否則將導致多個分支重疊(除非有意使多個分支重疊)。不要忘記最后那個default分支。即使程序真的不需要default處理,也應(yīng)該保留語句 default:break;這樣做并非多此一舉,而是為了防止別人誤以為你忘了default處理。goto語句寫法自從提倡結(jié)構(gòu)化設(shè)計以來,goto就成了有爭議的語句。首先,由于goto語句可以靈活跳轉(zhuǎn),如果不加限制,它的確會破壞結(jié)構(gòu)化設(shè)計風格。其次,goto語句經(jīng)常帶來錯誤或隱患。它可能跳過了某些對象的構(gòu)造、變量的初始化、重要的計算等語句,例如:g

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論