![[計算機軟件及應用]C和C++編碼規(guī)范_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/1/07c2ed9d-1582-45dd-b262-57a729d7dac9/07c2ed9d-1582-45dd-b262-57a729d7dac91.gif)
![[計算機軟件及應用]C和C++編碼規(guī)范_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/1/07c2ed9d-1582-45dd-b262-57a729d7dac9/07c2ed9d-1582-45dd-b262-57a729d7dac92.gif)
![[計算機軟件及應用]C和C++編碼規(guī)范_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/1/07c2ed9d-1582-45dd-b262-57a729d7dac9/07c2ed9d-1582-45dd-b262-57a729d7dac93.gif)
![[計算機軟件及應用]C和C++編碼規(guī)范_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/1/07c2ed9d-1582-45dd-b262-57a729d7dac9/07c2ed9d-1582-45dd-b262-57a729d7dac94.gif)
![[計算機軟件及應用]C和C++編碼規(guī)范_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/1/07c2ed9d-1582-45dd-b262-57a729d7dac9/07c2ed9d-1582-45dd-b262-57a729d7dac95.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、.C/C+編碼規(guī)則文件狀態(tài):草稿公開類型:內(nèi)部公開文檔編號:當前版本:V1.0作 者:制作部門:終端軟件研發(fā)部完成日期:2012年07月08日;- 77 -編寫與修改記錄版本號完成日期更改位置更改內(nèi)容編制/修改審批V1.02012.07.08全文初稿C/C+編碼規(guī)則V1.0 目 錄章節(jié)目錄第1章前言- 7 -第2章RULECHECKER規(guī)則集- 7 -2.1基本規(guī)則集- 7 -2.1.1ansi 函數(shù)的聲明和定義要遵守ANSI規(guī)定的格式- 7 -2.1.2asscal 在函數(shù)調(diào)用語句中不要使用賦值操作符- 8 -2.1.3asscon 不要在控制語句的條件表達式中使用賦值操作符- 9 -2.1
2、.4assexp 賦值表達式中的規(guī)定- 9 -2.1.5blockdecl 在語句塊的頭部定義變量- 10 -2.1.6boolean 使用正確格式的布爾表達式- 10 -2.1.7brkcont 程序中禁用break、continue- 11 -2.1.8classuse 對未知類成員的使用- 11 -2.1.9cmclass一個源文件只對應一個類- 12 -2.1.10cmdef 源文件中不要有類的聲明- 12 -2.1.11condop 關于"? . : ." 操作符- 12 -2.1.12const 使用常量- 13 -2.1.13constrcpy 關于拷貝構造函
3、數(shù)- 14 -2.1.14constrdef 關于默認構造函數(shù)- 14 -2.1.15ctrlblock 清晰劃分控制語句的語句塊- 15 -2.1.16destr 關于析構函數(shù)- 15 -2.1.17dmaccess 類數(shù)據(jù)成員的訪問控制- 16 -2.1.18exprcplx 表達式的復雜性- 16 -2.1.19exprparenth 在表達式中使用括號- 17 -2.1.20fntype 必須為函數(shù)返回值指定類型- 18 -2.1.21frndclass 關于友員的聲明位置- 18 -2.1.22funcres 設置禁止使用的函數(shù)- 18 -2.1.23goto 禁用Goto語句- 1
4、9 -2.1.24Headercom 對文件注釋的要求- 20 -2.1.25headercom 函數(shù)、類的注釋- 21 -2.1.26hmclass 一個頭文件中只聲明一個類- 21 -2.1.27hmdef 頭文件中只包含聲明,不應包含實現(xiàn)- 21 -2.1.28hmstruct 避免重復包含頭文件- 22 -2.1.29identfmt 對命名的要求- 23 -2.1.30identl 對標識符長度的要求- 23 -2.1.31identres 設置禁止使用的標識符- 24 -2.1.32imptype 明確指定類型- 24 -2.1.33incltype 設置可包含的文件- 24 -2
5、.1.34inldef 關于內(nèi)聯(lián)函數(shù)的聲明和定義- 25 -2.1.35macrocharset 在宏中禁用某些字符- 25 -2.1.36macroparenth 括號在宏中的使用- 26 -2.1.37mconst 限制宏常量的使用- 26 -2.1.38mfunc 用內(nèi)聯(lián)函數(shù)代替宏函數(shù)- 27 -2.1.39mname 文件命名- 28 -2.1.40multiass 一條程序語句中只應包含一個賦值操作符- 29 -2.1.41nopreproc 限制使用編譯指令- 29 -2.1.42nostruct 不要使用結構體- 30 -2.1.43notemplate 不要使用模板- 30 -
6、2.1.44nothrow 不要拋擲異常- 30 -2.1.45nounion 不要使用聯(lián)合體- 30 -2.1.46operass 為類重載“=”操作符- 31 -2.1.47parammode 明確標識出函數(shù)參數(shù)的類型- 31 -2.1.48parse 分析錯誤- 32 -2.1.49ptraccess 指針指向的數(shù)據(jù)成員的訪問方式- 32 -2.1.50ptrinit 對指針的初始化- 32 -2.1.51sectord "public", "private"和"protected" 的聲明順序- 33 -2.1.52sganc
7、str 擁有共同的基類- 35 -2.1.53sgdecl 一次只聲明、定義一個變量- 35 -2.1.54sglreturn 一個函數(shù)應該只有一條return語句- 35 -2.1.55slcom 注釋使用“/”- 36 -2.1.56slstat 一行只寫一條語句- 36 -2.1.57swdef switch語句中的default分支- 37 -2.1.58swend 對switch語句中每個分支結尾的要求- 37 -2.1.59typeinher 明確指明派生類與基類的關系- 38 -2.1.60typeres 設置禁用的類型- 38 -2.1.61vararg 禁止函數(shù)使用可變數(shù)量的
8、參數(shù)- 39 -2.1.62varstruct 關于定義struct、union變量- 39 -2.2Scott Meyers 規(guī)則集- 40 -2.2.1assignthis 在"="操作符定義中檢查是否自己賦值給自己- 40 -2.2.2cast Prefer 盡量使用C+風格的類型轉換- 41 -2.2.3catchref 通過引用捕獲異常- 41 -2.2.4constrinit 盡量在構造函數(shù)的初始化列表中對數(shù)據(jù)成員初始化- 42 -2.2.5convnewdel 重載new、delete操作符時應遵守的約定- 42 -2.2.6dataptr 指針數(shù)據(jù)成員- 4
9、3 -2.2.7delifnew 如果你重載了操作符"new",也應該重載操作符 "delete"- 43 -2.2.8excepspec 審慎使用異常處理- 43 -2.2.9inlinevirt 內(nèi)聯(lián)虛擬函數(shù)- 43 -2.2.10multinher 盡量不要使用多繼承- 44 -2.2.11nonleafabs 將非末端類設計為抽象類- 44 -2.2.12normalnew 不要遮掩了"new"的正規(guī)形式- 45 -2.2.13overload 不要重載“&&”、“|”、“,”- 45 -2.2.14prepo
10、st “+”、“-”操作符前綴形式與后綴形式的區(qū)別- 45 -2.2.15refclass 類的引用- 46 -2.2.16returnthis 在重載“=”時,使其返回*this- 46 -2.2.17tryblock Try語句塊- 47 -2.2.18trydestr 析構函數(shù)中的異常處理- 47 -2.2.19virtdestr 虛擬析構函數(shù)(Virtual destructor)- 47 -2.2.20assignthis(Check for Assignment to "self" in Operator "=" )- 48 -2.2.21c
11、ast(c+風格的類型轉換 )- 48 -2.2.22dataptr(數(shù)據(jù)的指針類型)- 48 -2.2.23delarray (Use square brackets when deleting arrays to ensure full array is deallocated)- 49 -2.2.24exprparenth(Parenthesses should be used to indicate evaluation order)- 50 -2.2.25forinit (循環(huán)的計數(shù)器(在for循環(huán)中)必須在循環(huán)的初始化語句段中初始化)- 51 -2.2.26funcptr(不使用函
12、數(shù)指針)- 51 -2.2.27globinit (全局變量必須在定義的時候初始化)- 52 -2.2.28multinher(Multiple Inheritance Only Allowed for Inheriting Abstract )- 52 -2.2.29nonleafabs (Make non-leaf classes abstract)- 52 -2.2.30nostruct- 52 -2.2.31pmfrtn (不返回指針成員數(shù)據(jù))- 53 -2.2.32refclass (類的引用)- 53 -2.2.33rtnlocptr (不能返回一個指向一個非靜態(tài)局部變量)- 53
13、 -2.2.34vararg vararg(Variable Number of Arguments )- 53 -2.2.35varinit(參數(shù)在使用前要初始化 )- 53 -2.2.36varstruct(Struct 和 Union 變量 )- 54 -2.2.37voidptr(沒有空指針)- 55 -2.3MISRA C規(guī)則集- 55 -2.3.1Operator defined.操作符定義.- 55 -2.3.2Pointer arithmetic算術指針- 56 -2.3.3Limitation of the reference complexity- 56 -2.3.4Rel
14、ational operators and pointers操作符和指針之間的連系- 56 -2.3.5Pointers to functions函數(shù)指針- 56 -2.3.6Pointers to functions.- 56 -2.3.7Address assignment.地址分配- 57 -2.3.8Null pointer.空指針- 57 -2.3.9structures 和 unions成員- 57 -2.3.10Variable storage.變量存儲- 57 -2.3.11Identifiers must not exceed 31 characters.標識符不要超過31個
15、字符- 57 -2.3.12Unions access. Union訪問- 58 -2.3.13Type of bitfields.位域類型- 58 -2.3.14Two bits long bit fields.位域兩字節(jié)長度- 58 -2.3.15Members of structure and unions shall be named.- 58 -2.3.16Define and undef standard names.- 58 -2.3.17Standard library functions.標準庫函數(shù)- 59 -2.3.18Dynamic heap memory.動態(tài)分配內(nèi)存-
16、 59 -2.3.19Error indicator errno. 錯誤指示errno- 59 -2.3.20Name of identifiers.標識符命名- 59 -2.3.21No offsetof macro.- 60 -2.3.22No <locale.h> functions.- 60 -2.3.23No setjmp macro or longjmp function.- 60 -2.3.24No <signal.h> functions.- 60 -2.3.25No <stdio.h> functions.- 60 -2.3.26No at
17、of, atoi or atol functions.- 61 -2.3.27No abort, exit, getenv or system functions.- 61 -2.3.28No <time.h> functions.- 61 -2.3.29Type char is not allowed- 62 -2.3.30Underlying representation of floating point numbers.- 62 -2.3.31Typedef names shall not be reused.- 62 -2.3.32Numeric constants an
18、d suffixes.- 63 -2.3.33Octal constants. 八進制常量- 63 -2.3.34Declaration before use.- 64 -2.3.35Identifiers scope.- 64 -2.3.36Object declarations.- 64 -2.3.37Functions declaration.- 65 -2.3.38External definition of identifiers.- 65 -2.3.39External variables declaration.- 65 -2.3.40register storage class
19、 specifier.- 66 -2.3.41Use of tags.- 66 -2.3.42Structured initialisation.結構初始化- 66 -2.3.43Enum Initialisation數(shù)組初始化- 66 -2.3.44Side effects in condition- 67 -2.3.45Logical Operand.- 67 -2.3.46Bitwise operations shall not be performed on signed integer types.- 67 -2.3.47Shift operator and right hand o
20、perand.- 68 -2.3.48The unary minus operator shall not be applied to an unsigned expression.- 68 -2.3.49Operator sizeof.- 68 -2.3.50Operator ',' not allowed.- 69 -2.3.51Conversions.- 69 -2.3.52Redundant casts.- 69 -2.3.53Cast and pointers.- 69 -2.3.54Evaluation order of expressions.- 69 -2.3.
21、55Mixed precision arithmetic and cast.- 69 -2.3.56Test between floats.- 70 -2.3.57Inaccessible code not authorized.- 70 -2.3.58Non-null statements.- 70 -2.3.59Location of null statements.- 71 -2.3.60No Labels.- 71 -2.3.61Use of curly brackets- 71 -2.3.62Then and else parts of if statements must not
22、be void- 71 -2.3.63Default statement mandatory in a switch.- 72 -2.3.64No switch with only one case.- 72 -2.3.65Floating point variables should not be used as loop counters.- 72 -2.3.66Loop control.- 72 -2.3.67Counter in for statements- 72 -2.3.68Functions shall always be declared at file scope.- 73
23、 -2.3.69No functions with variable number of arguments.- 73 -2.3.70Trigraphs are forbidden.- 73 -2.3.71Recursion not recommended- 73 -2.3.72Function prototyping.- 74 -2.3.73Matching numbers of parameters.- 74 -2.3.74Values of void functions.- 74 -2.3.75Void expressions and function parameters.- 74 -
24、2.3.76Return in non-void functions.- 74 -2.3.77Return in void functions.- 74 -2.3.78Function with no parameters.- 75 -2.3.79Multibyte characters.- 75 -2.3.80No nested comments.- 75 -2.3.81Define and undefine in a block.- 75 -2.3.82Use of #undef.- 75 -2.3.83Functions and macros.- 75 -2.3.84Arguments
25、to function-like macros.- 76 -2.3.85Parentheses for macro occurences.- 76 -2.3.86Parentheses for macro.- 76 -2.3.87Identifiers in pre-processor directives.- 76 -2.3.88Directive pragma.- 76 -2.3.89Forbidden #include.- 77 -2.3.90Use of void type and functions.- 77 -2.3.91#include syntax.- 77 -第1章 前言本文
26、擋詳細描述了在LogiscopeRulechecker中包含的所有編碼規(guī)范。對每一條編碼規(guī)范,分別給出了它的名稱、規(guī)范的內(nèi)容描述、參數(shù)(只針對可設置的規(guī)范)、遵守規(guī)范的好處以及示例。Rulechecker共包含81條編碼規(guī)范,其中有30條左右可以對其內(nèi)容進行定制,對于可定制編碼規(guī)范的具體定制方法,可參見RuleChecker可定制規(guī)則。第2章 Rulechecker規(guī)則集Rulechecker規(guī)則集分為兩大部分:基本規(guī)則集和Scott Meyers規(guī)則集。我們先來逐條介紹基本規(guī)則集中的規(guī)則。2.1 基本規(guī)則集2.1.1 ansi 函數(shù)的聲明和定義要遵守ANSI規(guī)定的格式規(guī)則描述: 函數(shù)聲明和定
27、義的格式,要符合ANSI規(guī)定的格式要求。它要求滿足以下兩項中的一項: name:為函數(shù)參數(shù)列表中的參數(shù)指定數(shù)據(jù)類型和參數(shù)名稱。 void: 禁止函數(shù)參數(shù)列表為空。在RuleChecker的默認情況下,以上兩項同時生效。參數(shù): 可供選擇的字符串,“name”和“void”。目的: 提高代碼的可讀性,改善可移植性。舉例:正確寫法錯誤寫法f(int a, char *b) . f(int a, char *b); f(void);f(a, b)int a;char *b . f(int, char*);f();2.1.2 asscal 在函數(shù)調(diào)用語句中不要使用賦值操作符規(guī)則描述:
28、 函數(shù)調(diào)用語句中,在函數(shù)的參數(shù)列表中不要使用賦值操作符。賦值操作符包括=, +=, -=, *=, /=, %=, >>=, <<=, &=, |=, =,+,-。目的:避免產(chǎn)生不明確的賦值順序。舉例:正確寫法錯誤寫法void fun1(int a);void fun2(int b) fun1( +b );2.1.3 asscon 不要在控制語句的條件表達式中使用賦值操作符規(guī)則描述:不要在控制語句if, while, for 和 switch的條件表達式中使用賦值操作符。賦值操作符包括:=, +=, -=, *=, /=, %=, >>=, <
29、<=, &=, |=, =,+,-。目的:一個類似于 if (x=y)這樣的寫法是不明確、不清晰的,代碼的作者也許是想寫成這樣: if (x=y)。舉例:正確寫法錯誤寫法x -= dx;if (x) . for (i=j=n; i > 0; i-, j-) .if (x -= dx) . for (i=j=n; -i > 0; j-) .2.1.4 assexp 賦值表達式中的規(guī)定規(guī)則描述:在一個賦值表達式中: 一個左值,在表達式中應該僅被賦值一次。對于多重賦值表達式,一個左值在表達式中僅應出現(xiàn)一次,不能重復出現(xiàn)。目的:避免產(chǎn)生不明確的賦值順序。舉例:正確寫法錯誤寫法
30、b=c+a;a=b;a=b=c+a;2.1.5 blockdecl 在語句塊的頭部定義變量規(guī)則描述:變量的定義要出現(xiàn)在使用該變量的語句塊的開頭。目的:提高代碼的可讀性。2.1.6 boolean 使用正確格式的布爾表達式規(guī)則描述:對于if, while, for等控制語句的布爾表達式,要使用正確的格式。目的: 使代碼更容易理解。舉例:正確寫法錯誤寫法AlwaysTrue = true;while (AlwaysTrue = true) if (test = true) for (i=1; function_call(i) = true; i+) while (1) if (test) for
31、(i=1; function_call(i); i+) 2.1.7 brkcont 程序中禁用break、continue規(guī)則描述:在控制語句 (for, do, while) 塊中,禁止使用Break和continue。不過,在switch語句塊中,可以使用break。目的:和goto語句一樣, 使用Break和continue會打亂代碼結構化的流程。在循環(huán)語句塊中禁用goto、Break和continue,會增加代碼的可讀性。2.1.8 classuse 對未知類成員的使用規(guī)則描述:在代碼中不要使用如下形式的表達式 :u.v.a, u.v.f(),u.g().a, u.g().f(),也不
32、要有使用“->”操作符的類似形式的表達式。目的:防止類對象通過多級的“.”、“->”操作符,調(diào)用未知的成員函數(shù)、數(shù)據(jù)成員。類與類之間的接口應該清晰。舉例:/不要象下面這樣寫代碼:myWindow.itsButton.push();其中,對象myWindow的基類為類Window,itsButto是Window的一個公共數(shù)據(jù)成員,它也是一個類對象,itsButto有一個叫做push()的公共成員函數(shù)。我們應該清楚的是,類Window才是myWindow訪問其的接口,myWindow 只應訪問到itsButton,而不應該訪問到itsButton.push()這一級,因為push()已
33、經(jīng)不屬于基類Window對myWindow的接口。再舉一個例子:Error.pos.line;這和上面例子的道理一樣,只是這一次由訪問成員函數(shù)變?yōu)榱嗽L問數(shù)據(jù)成員line,這同樣是不好的。2.1.9 cmclass一個源文件只對應一個類規(guī)則描述:在一個源文件中定義的每一個函數(shù),都應該屬于同一個類,即對一個類的描述要獨占一個文件。其中,源文件指以*.cc, *.cxx, *.cpp, *.C or *.c為后綴的代碼文件。參數(shù):可供選擇的字符串,包括*.cc, *.cxx, *.cpp, *.C or *.c,用來設置檢查什么類型的代碼文件。目的:提高代碼的可讀性。2.1.10 cmdef 源文件
34、中不要有類的聲明規(guī)則描述:在一個源文件中不應該包含任何類的聲明,而只應該是對類的實現(xiàn),類聲明應該統(tǒng)一放到頭文件中去。其中,源文件指以*.cc, *.cxx, *.cpp, *.C or *.c為后綴的代碼文件。參數(shù):可供選擇的字符串,包括*.cc, *.cxx, *.cpp, *.C or *.c,用來設置檢查什么類型的代碼文件。目的:提高代碼的可讀性。2.1.11 condop 關于"? . : ." 操作符規(guī)則描述:程序中不要使用三元運算符“? : ”。目的:提高代碼的可讀性。2.1.12 const 使用常量規(guī)則描述:程序中的數(shù)字和字符串,都要顯示的聲明、定義為常量。
35、在RuleChecker默認的情況下,只允許程序中直接出現(xiàn)下面這四個數(shù)字和字符串量,它們分別是:""(空字符串), " "(只包含一個空格的字符串), "0"(數(shù)字0)和 "1"(數(shù)字1)。其它任何的數(shù)字和字符串,都要定義為常量。參數(shù):可供選擇的字符串,用來指出那些允許在程序中直接出現(xiàn),而不必以常量定義的數(shù)字和字符串。目的:這樣做可以避免數(shù)字和字符串零散分布在代碼中,使代碼修改起來相當費力。遵守這項規(guī)則可以提高代碼的可維護性。注意:在對某些量的初始化列表中 (比如數(shù)組、結構體),RuleChecker僅會對其前5個
36、數(shù)據(jù)成員依照該項規(guī)則進行檢查。舉例:正確寫法錯誤寫法#define TAB_SIZE 100enum i_val ok =7; ko =11;const char HelloWorld = "Hello World.n"char tabTAB_SIZE;i_val i;.if (i = ok) p = HelloWorld; char tab100;int i;.if (i = 7) p = "Hello World.n"2.1.13 constrcpy 關于拷貝構造函數(shù)規(guī)則描述:每一個類都應該顯示的定義拷貝構造函數(shù)。參數(shù):參數(shù)只有一個,要么為空,要么為
37、字符串"dynalloc"。如果設置參數(shù)為"dynalloc",那么RuleChecker僅在當類中包含指針類型的數(shù)據(jù)成員時,才要求類要顯示定義拷貝構造函數(shù);如果設置參數(shù)為空,則不管類中包含什么樣的成員,都要顯示定義拷貝構造函數(shù)。目的:確保類的編寫者考慮類對象在被拷貝時可能出現(xiàn)的各種情況。舉例:class aClass .aClass(const aClass &object); / "const" 并不是必須的.;2.1.14 constrdef 關于默認構造函數(shù)規(guī)則描述: 每一個類都應該顯示的定義默認構造函數(shù)。目的:確保類
38、的編寫者考慮類對象初始化時可能出現(xiàn)的各種情況。舉例:class aClass .aClass();.;2.1.15 ctrlblock 清晰劃分控制語句的語句塊規(guī)則描述:控制語句(if , for , while , do.whule).的語句部分一定要用 和 括起來,以劃分出清晰的語句塊。目的:這樣做,能夠使語句的歸屬明確,使代碼更加容易閱讀和修改。舉例:正確寫法錯誤寫法if (x = 0) return; else while (x > min) x-;if (x = 0) return;elsewhile (x > min)x-;2.1.16 destr 關于析構函數(shù)規(guī)則描述
39、: 每一個類都應該顯示的定義析構函數(shù)。目的:確保類的編寫者考慮類對象在析構時,可能出現(xiàn)的各種情況。舉例:class aClass .aClass(aClass &object);.;2.1.17 dmaccess 類數(shù)據(jù)成員的訪問控制規(guī)則描述:類對外的接口應該是完全功能化的,也就是類中可以定義Public的成員函數(shù),但不應該有Public的數(shù)據(jù)成員。在RuleChecker默認情況下,會檢查類中是否聲明了Public數(shù)據(jù)成員,如果有,則視為違反了該條規(guī)則。參數(shù):參數(shù)是public、protected、privatr這三個字符串。通過指定相應的字符串,RuleChecker就會禁止類中聲
40、明與之相對應的數(shù)據(jù)成員。目的:要想改變對象的當前狀態(tài),應該通過它的成員函數(shù)來實現(xiàn),而不應該通過直接設置它的數(shù)據(jù)成員。一個類的數(shù)據(jù)成員應該聲明為private的,最起碼也應該是protected的。2.1.18 exprcplx 表達式的復雜性規(guī)則描述:對于表達式的復雜性,要有一定的限制。表達式的復雜性通過一個叫做關聯(lián)語法樹(associated syntactictree)的指標來衡量,它的計算方法為:表達式中操作符的數(shù)量加上操作數(shù)的數(shù)量再加1。在RuleChecker默認情況下,表達式復雜性的上限被設定為13。參數(shù):是一個數(shù)字,用來指定表達式復雜性的最大可接受程度。目的:提高代碼的可讀性。舉
41、例:對于下面這個表達式:(b+c*d) + (b*f(c)*d)它包含了8個操作符,7個操作數(shù),因此該表達式關聯(lián)語法樹為16。如果你設定的參數(shù)的上限小于等于16,則RuleChecker會認為此表達式違反了該條規(guī)則。2.1.19 exprparenth 在表達式中使用括號規(guī)則描述:對于一個表達式,在每一個二元、三元操作的開始和結束處,都要放置“(”和“)”。在RuleChecker中,我們可以通過放置partpar參數(shù)來減少一些限制。放置partpar參數(shù)后:當在操作符"+" 或"*"右邊的操作數(shù)的右邊又使用了"+" 或"*
42、"操作符時,可以不放置“(”和“)”;對賦值操作符右邊的操作數(shù),可以忽略“(”和“)”;在表達式的最外層也可以忽略“(”和“)”。除此之外的其它情況,都要放置“(”和“)”。在RuleChecker默認情況下,參數(shù)partpar被設置。參數(shù):參數(shù)為字符串"partpar",如果放置了該參數(shù),則RuleChecker不按照最嚴格的要求檢測代碼,而是按我們上面提到的要求來檢測代碼。否則,按照最嚴格的要求檢測代碼。目的:避免出現(xiàn)不明確的運算、賦值順序。舉例:正確寫法錯誤寫法result = (fact / 100) + rem);/當放置了partpar參數(shù)時,也可以寫
43、成這樣result = (fact / 100) + rem;/當放置了partpar參數(shù)時,可以用下面的寫法result = (fact * ind * 100) + rem + 10 + (coeff * c);/ 代替如下的寫法result = (fact * (ind * 100) + (rem + (10 + (coeff * c);result = fact / 100 + rem;2.1.20 fntype 必須為函數(shù)返回值指定類型規(guī)則描述:要為每一個函數(shù)指定它的返回值類型。如果函數(shù)沒有返回值,則要定義返回類型為void。目的:改善代碼的可移植性。2.1.21 frndclass
44、 關于友員的聲明位置規(guī)則描述:如果將一個(或若干個)類聲明為另一個類的友員,則必須將這個(這些)友員聲明放在類所有數(shù)據(jù)成員聲明的最前面。2.1.22 funcres 設置禁止使用的函數(shù)規(guī)則描述:禁止在程序中聲明、定義、調(diào)用我們指定函數(shù)名的函數(shù)。在RuleChecker默認情況下,不禁用任何的函數(shù)名。參數(shù):參數(shù)是一系列的字符串列表,其中的每個字符串就是在程序中要禁用的函數(shù)的名字。目的:通過禁用一些只與特定平臺相關聯(lián)的函數(shù),可以提高程序的可移植性。除此之外,你還可以通過設定該規(guī)則來實現(xiàn)一些其它的目的,比如禁用某些極易導致程序發(fā)生錯誤的函數(shù),等等。舉例:如果我們設置了在程序中禁用函數(shù)fun(int
45、nCount),則在代碼中出現(xiàn)下面的任何一種情況, RuleChecker都會認定程序違反了該條規(guī)則。Void fun (int nCount);/聲明Void fun (int nCount)/定義.fun ( 1 );/調(diào)用2.1.23 goto 禁用Goto語句規(guī)則描述:程序中不要使用goto語句。在RuleChecker默認情況下,出現(xiàn)在程序任何地方的goto語句都是被禁止的。不過,我們可以通過設置,使得goto跳轉到我們指定的語句行號的語句為合法。參數(shù):參數(shù)是一個字符串的列表,每個字符串都代表一個語句行號,表示允許在程序中通過goto跳轉到該語句行號。目的:這條規(guī)則的目的是為了確保程
46、序的結構化,因為濫用goto語句會使程序流程無規(guī)則,可讀性差。Goto語句只在一種情況下有使用價值,就是當要從多重循環(huán)深處跳轉到循環(huán)之外時,效率很高,但對于一般要求的軟件,沒有必要費勁心思追求多么高的效率,而且效率主要是取決于算法,而不在于個別的語句技巧。2.1.24 Headercom 對文件注釋的要求規(guī)則描述:在頭文件、實現(xiàn)文件的首部一定要有文件注釋。在RuleChecker中,我們還可以規(guī)定這個文件注釋的具體格式。在RuleChecker默認情況下,頭文件和實現(xiàn)文件的文件注釋中必須包括:文件名、開發(fā)者、開發(fā)日期、功能簡介這四部分,都是以英文表示的(見下面的示例),我們也可以設置成中文。參
47、數(shù):參數(shù)由兩個字符串列表來表示:第一部分是對頭文件的文件注釋格式要求,第二部分是對實現(xiàn)文件的文件注釋格式要求。每個列表都是以"HEADER" 或"CODE"開頭,后面是對注釋格式的具體描述。目的:提高代碼的可讀性。舉例:下面是一個符合RuleChecker默認的對頭文件文件注釋格式要求的例子:/ Name: program/ Author: Andrieu/ Date: 08/07/96/ Remarks: example of comments/2.1.25 headercom 函數(shù)、類的注釋規(guī)則描述:在全局、靜態(tài)函數(shù)的聲明、定義和類的聲明、定義之前,
48、要對該函數(shù)或類加以注釋。在RuleChecker中,我們還可以規(guī)定這個文件注釋的格式,RuleChecker默認情況下,在函數(shù)或類之前必須有以“/”開頭的注釋,注釋內(nèi)容不限。參數(shù):參數(shù)是五個字符串列表,這五個字符串列表分別以“class”、 "func_glob_def" 、"func_glob_decl"、"func_stat_def"、"func_stat_decl"開頭,分別代表聲明類、定義全局函數(shù)、聲明全局函數(shù)、定義靜態(tài)函數(shù)、聲明靜態(tài)函數(shù),后面跟著的就是對注釋格式的具體要求。目的:提高代碼的可讀性。2.1.
49、26 hmclass 一個頭文件中只聲明一個類規(guī)則描述:在一個頭文件中,只應該包含對一個類的聲明(嵌套類的情況除外)。RuleChecker默認情況下,頭文件是指以.h、.hh、.H、.hxx、.hpp為后綴的文件。參數(shù):參數(shù)是可供選擇的字符串,比如.h、.hh、.H等,用來設置檢查什么類型的代碼文件。目的:提高代碼的可讀性。2.1.27 hmdef 頭文件中只包含聲明,不應包含實現(xiàn)規(guī)則描述:在頭文件中不要定義全局變量和全局函數(shù)。在RuleChecker默認情況下,頭文件指以.h、 .hh、.H、 .hxx、.hpp為后綴的代碼文件。參數(shù):參數(shù)為可供選擇的字符串,包括*.h, *.hh,*.H
50、, *.hxx、*.hpp,用來設置檢查什么類型的代碼文件。目的:在頭文件中只應該包含各種聲明,而不應該包含具體的實現(xiàn)。2.1.28 hmstruct 避免重復包含頭文件規(guī)則描述:頭文件的格式應該為:#ifndef <IDENT>#define <IDENT>.#endif或者#if !defined (<IDENT>)#define <IDENT>.#endif上面的<IDENT>是一個標識字符串。RuleChecker要求在該標識字符串中必須包含相應頭文件的文件名,不區(qū)分大小寫。參數(shù):參數(shù)有兩個,一個用于設置標識字符串的長度,另一
51、個參數(shù)設置檢查什么類型的代碼文件。目的:避免對同一頭文件的重復包含。舉例:/ 對于文件audit.h,它的文件結構應該為:#ifndef AUDIT_H#define AUDIT_H.#endif2.1.29 identfmt 對命名的要求規(guī)則描述:在程序中聲明、定義的函數(shù)、自定義數(shù)據(jù)類型、變量,在對其命名時都應該遵守一個統(tǒng)一的命名規(guī)范。在RuleChecker默認情況下,只規(guī)定在常量、宏中不能使用小寫的英文字母。參數(shù):參數(shù)是一系列的字符串,單數(shù)編號字符串指出了你要設定的對象,雙數(shù)字符串指出了你為其設定的具體格式。目的:提高代碼的可讀性。2.1.30 identl 對標識符長度的要求規(guī)則描述:
52、在程序中聲明、定義的函數(shù)、自定義數(shù)據(jù)類型、變量,它們的名稱的長度要在設定的范圍之內(nèi)。RuleChecker默認情況下規(guī)定:函數(shù)名長度在4到25個字符之間,自定義數(shù)據(jù)類型名、變量名、常量名、宏名、類名長度在5到25個字符之間,其它標識符的長度在1到25個字符之間。參數(shù):參數(shù)分三列,第一列指出了你要設定的對象,第二列、第三類指出了命名的長度范圍。目的:提高代碼的可讀性。2.1.31 identres 設置禁止使用的標識符規(guī)則描述:某些標識符在代碼中應該被禁用。比如,類庫中的某些數(shù)據(jù)成員的名字。在RuleChecker默認情況下,不禁用任何標識符。參數(shù):參數(shù)是一系列的字符串列表,其中的每個字符串就是
53、在程序中要禁用的標識符。目的:改善代碼的可移植性。2.1.32 imptype 明確指定類型規(guī)則描述:要明確指定函數(shù)、函數(shù)參數(shù)、類數(shù)據(jù)成員、變量的類型。目的:改善代碼的可移植性。舉例:正確寫法錯誤寫法void aFunction(void);aFunction();2.1.33 incltype 設置可包含的文件規(guī)則描述:只允許在指定類型的代碼文件中包含其它代碼文件。在RuleChecker默認情況下,只允許頭文件被包含到其它代碼文件中去。參數(shù):參數(shù)為兩個字符串列表,每個列表中的第一個字符串指定了目標文件的類型,第二個字符串指出了都有那些類型的文件可以被包含到該目標文件中去。目的:改善程序代碼
54、的組織結構。2.1.34 inldef 關于內(nèi)聯(lián)函數(shù)的聲明和定義規(guī)則描述:內(nèi)聯(lián)函數(shù)的定義部分,要放到類的實現(xiàn)文件(.cpp)中去,而不要直接放在頭文件中。參數(shù):參數(shù)只有一個,字符串“private”,該參數(shù)可以用也可以不用。當放置了“private”這個字符串時,private型內(nèi)聯(lián)函數(shù)的定義要放到類的實現(xiàn)文件(.cpp)中去,其它內(nèi)聯(lián)函數(shù)的定義要放在頭文件中;當沒有放置這個字符串時,所有的內(nèi)聯(lián)函數(shù)的定義部分,都要放到實現(xiàn)文件(.cpp)中去。目的:提高代碼的可讀性。該規(guī)則存在的問題:放置參數(shù)“private”后并不起作用。不管是否放置了“private”字符串,該規(guī)則都會要求將所有內(nèi)聯(lián)函數(shù)的定義放到實現(xiàn)文件(.cpp)中去。2.1.35 macrocharset 在宏中禁用某些字符規(guī)則描述:可以在宏中(這里的宏只包括宏函數(shù)和宏常量這兩類宏,并且檢查部分只是指宏的展開部分,而不包括宏的名字)禁用某些字符。在RuleChecker默認情況下,不禁用任何字符。參數(shù):參數(shù)為兩對相互關聯(lián)的
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 股權轉讓撤銷與公司治理優(yōu)化合同
- 車輛抵押貸款合同糾紛處理辦法
- 測繪設備研發(fā)與技術保密合同
- 醫(yī)療設備安裝危險源分析與應對措施
- 船舶制造保修方案與措施
- 電子產(chǎn)品出廠前成品保護措施
- 大型工程項目施工協(xié)調(diào)實施措施
- 社會工作倫理問題案例分析考核試卷
- 盾構機施工中的隧道工程地質災害防治考核試卷
- 航空業(yè)特種設備管理制度范文
- 藥理學知到智慧樹章節(jié)測試課后答案2024年秋哈爾濱商業(yè)大學
- 智能病歷質控系統(tǒng)需求說明
- 山東省煙臺市萊州市一中2025屆高考數(shù)學押題試卷含解析
- 2023年高考真題-生物(遼寧卷) 含答案
- 叉車出租行業(yè)市場調(diào)研分析報告
- 專題02代數(shù)推理題(真題2個考點模擬16個考點)(原卷版+解析)
- 變壓器維修投標方案
- 2025屆山東師范大學附中高考適應性考試歷史試卷含解析
- 四川省高職單招餐飲類《中式烹飪技藝》復習備考試題庫-下(判斷、簡答題)
- DL∕T 5783-2019 水電水利地下工程地質超前預報技術規(guī)程
- 中考字音字形練習題(含答案)-字音字形專項訓練
評論
0/150
提交評論