C語言編碼規(guī)則_第1頁
C語言編碼規(guī)則_第2頁
C語言編碼規(guī)則_第3頁
C語言編碼規(guī)則_第4頁
已閱讀5頁,還剩71頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

TOC\o"1-5"\h\z\o"CurrentDocument"1背景說明 1\o"CurrentDocument"2背景說明 1\o"CurrentDocument"3參考資料 1\o"CurrentDocument"4準則細則 1\o"CurrentDocument"準則1:對基本類型聲明和使用。(推薦) 1\o"CurrentDocument"準則2:過程名禁止被重用。(強制) 2\o"CurrentDocument"準則3:標號名禁止被重用。(強制) 2\o"CurrentDocument"準則4:一個文件中的程序總行一般不得超過2000行。(參考) 3\o"CurrentDocument"準則5:ー個過程(函數(shù)、子程序)中的程序總行一般不得超過200行。(參考) 3\o"CurrentDocument"準則6:嚴格審查條件判別的then分支中無任何執(zhí)行語句的情況。(強制) 3\o"CurrentDocument"準則7:嚴禁將過程聲明為指針類型。(強制) 3\o"CurrentDocument"準則8:禁止直接從過程中跳出。(強制) 4\o"CurrentDocument"準則9:嚴格審查條件判別的else分支中無任何執(zhí)行語句的情況。(強制) 4\o"CurrentDocument"準則10:禁止在非賦值表達式中出現(xiàn)了賦值操作符。(強制) 5\o"CurrentDocument"準則11:過程體必須用大括號括起來。(強制) 6\o"CurrentDocument"準則12:循環(huán)體必須用大括號括起來。(強制) 6\o"CurrentDocument"準則13:then/else中的語句必須用大括號括起來。(強制) 6\o"CurrentDocument"準則14:盡量避免使用goto語句。(強制) 7\o"CurrentDocument"準則15:盡量避免將過程定義為參數(shù)。(推薦) 7\o"CurrentDocument"準則16:禁止在結構體定義中含有空域。(強制) 8\o"CurrentDocument"準則17:禁止聲明多重標號。(強制) 8\o"CurrentDocument"準則18:過程中避免使用過多的參數(shù),最多不要超過20個。(參考) 8\o"CurrentDocument"準則19:盡量避免過程參數(shù)在過程調(diào)用中未被使用。(推薦) 9\o"CurrentDocument"準則20:參數(shù)必須使用類型聲明。(強制) 9\o"CurrentDocument"準則21:實參與形參個數(shù)必須一致。(強制) 9\o"CurrentDocument"準則22:禁止使用一些模糊的語句。(強制) 10\o"CurrentDocument"準則23:禁止某個過程在其所在的文件中沒被任何調(diào)用。(強制) 10\o"CurrentDocument"準則24:盡量避免使用不加以分析的注釋。(推薦) 11\o"CurrentDocument"準則25:禁止switch語句的case中無語句。(強制) 11\o"CurrentDocument"準則26:使用無限循環(huán)必須嚴格審查。(強制) 12\o"CurrentDocument"準則27:禁止返回類型說明為void的過程中有retum語句返回值。(強制) 12\o"CurrentDocument"準則28:盡量避免使用“+=”或操作符。(推薦) 12\o"CurrentDocument"準則29:使用“++”或“一”操作符必須格外小心。(推薦) 13\o"CurrentDocument"準則30:禁止在循環(huán)中使用break語句。(強制) 14\o"CurrentDocument"準則31:盡量避免使用continue語句。(強制) 14\o"CurrentDocument"準則32:盡量避免使用三重的表達式。 15\o"CurrentDocument"準則33:在過程聲明中必須對參數(shù)說明。(強制) 15\o"CurrentDocument"準則34:返回類型為static的過程在其所在文件中必須被調(diào)用。(強制) 16\o"CurrentDocument"準則35:函數(shù)必須有返回語句。(強制) 16\o"CurrentDocument"準則36:禁止過程參數(shù)只有類型沒有標識符。(強制) 16\o"CurrentDocument"準則37:禁止使用不合適的循環(huán)變量類型。(強制) 17\o"CurrentDocument"準則38:循環(huán)變量必須是局部聲明的。(強制) 17\o"CurrentDocument"準則39:禁止在過程參數(shù)表中使用省略號。(強制) 18\o"CurrentDocument"準則40:禁止在結構體定義中使用位域。(強制) 18準則41:盡量避免使用setimp/longjmp.(推薦) 19\o"CurrentDocument"準則42:禁止使用禁用的過程,函數(shù),文件或名稱。(強制) 19\o"CurrentDocument"準則43:禁止重新定義使用C關健字。(強制) 19\o"CurrentDocument"準則44:禁止在禁止使用extern的文件中使用了extem。(強制) 20\o"CurrentDocument"準則45:數(shù)組使用必須保證不會出現(xiàn)越界。(強制) 20\o"CurrentDocument"準則46:在switch語句中必須有defult語句。(強制) 21\o"CurrentDocument"準則47:邏輯表達式的連接必須使用大括號。(強制) 21\o"CurrentDocument"準則48:禁止對有符號類型進行移位運算。(強制) 22\o"CurrentDocument"準則49:對變量進行移位運算必須保證不會產(chǎn)生溢出。(強制) 22\o"CurrentDocument"準則50:禁止給無符號變量賦負值。(強制) 22\o"CurrentDocument"準則51:盡量避免使用逗號操作符。(推薦) 23\o"CurrentDocument"準則52:謹防長度操作符sizeof的副作用。(強制) 23\o"CurrentDocument"準則53:禁止同一個表達式中調(diào)用多個的函數(shù)。(強制) 24\o"CurrentDocument"準則54:禁止對實數(shù)類型的量做是否相等的比較。(強制) 24\o"CurrentDocument"準則55:盡量避免使用不起作用的語句。(推薦) 25\o"CurrentDocument"準則56:盡量避免使用空語句。(推薦) 25\o"CurrentDocument"準則57:在if語句中應有else分支。(推薦) 25\o"CurrentDocument"準則58:禁止switch語句中為空。(強制) 26\o"CurrentDocument"準則59:禁止switch語句中只包含default語句。(強制) 26\o"CurrentDocument"準則60:禁止switch語句中的case語句沒有由break終止的。(強制) 27準則61:禁止procedure/function(過程/函數(shù))中參數(shù)表為空。(強制) 27準則62:禁止返回類型說明為Void的過程用在表達式中。(強制) 28\o"CurrentDocument"準則63:禁止void類型的變量作為參數(shù)進行傳遞。(強制) 28\o"CurrentDocument"準則64:禁止函數(shù)中只有一個return空語句而沒有返回值。(強制) 29\o"CurrentDocument"準則65:盡量避免在ー個塊中使用#define。(推薦) 29\o"CurrentDocument"準則66:禁止使用#undef。(強制) 29\o"CurrentDocument"準則67:謹慎使用#pragma。(推薦) 30\o"CurrentDocument"準則68:謹慎使用指針的邏輯比較。(推薦) 30準則69:禁止參數(shù)指針賦值給過程指針。(強制) 31\o"CurrentDocument"準則70:有符號類型的位長度必須大于等于兩位。(強制) 31\o"CurrentDocument"準則71:位的定義必須是有符號整數(shù)或無符號整數(shù)。(強制) 31\o"CurrentDocument"準則72:謹慎使用聯(lián)合(union)的聲明。(推薦) 32\o"CurrentDocument"準則73:禁止在頭文件前有可執(zhí)行代碼。(強制) 32\o"CurrentDocument"準則74:禁止在宏中使用了多個#或##。(強制) 32\o"CurrentDocument"準則75:禁止定義不象函數(shù)的宏。(強制) 32\o"CurrentDocument"準則76:宏參數(shù)必須用括號括起來。(強制) 33\o"CurrentDocument"準則77:禁止在宏中包含不允許的項。(強制) 33\o"CurrentDocument"準則78:指針的指針不能超過兩級。(強制) 34\o"CurrentDocument"準則79:禁止三字母詞的使用。(強制) 34\o"CurrentDocument"準則80:邏輯表達式應采用顯式的表達。(推薦) 34準則81:謹慎使用ハ進制數(shù)。(推薦) 35\o"CurrentDocument"準則82:謹慎使用寄存器變量。(推薦) 35\o"CurrentDocument"準則83:枚舉元素的初始化必須完整。(強制) 35\o"CurrentDocument"準則84:禁止重新定義保留字。(強制) 36\o"CurrentDocument"準則85:謹慎對指針進行代數(shù)運算。(推薦) 36\o"CurrentDocument"例如86:當嵌入?yún)R編程序時,嵌入過程必須是純匯編程序。(強制) 36\o"CurrentDocument"準則87:字符類型必須標明是有符號還是無符號。(強制) 37\o"CurrentDocument"準則88:禁止對ー個名字重新定義。(強制) 37\o"CurrentDocument"準則89:禁止重復使用同一個名字。(強制) 38\o"CurrentDocument"準則90:禁止給變量賦的值與變量的類型不一致。(強制) 38\o"CurrentDocument"準則91:禁止對指針變量使用強制類型轉換。(強制) 39\o"CurrentDocument"準則92:謹慎將其它類型變量強制轉換為指針類型。(推薦) 39\o"CurrentDocument"準則93:謹慎使用混合運算方式。(推薦) 39\o"CurrentDocument"準則94:盡量避免使用不必要的類型轉換。(推薦) 40\o"CurrentDocument"準則95:禁止實參和形參類型不一致。(強制) 40\o"CurrentDocument"準則96:盡量不要以非調(diào)用方式使用函數(shù)。(推薦) 41準則97:頭文件名不能使用"〃'、"'”和“/”等字符。(強制) 41\o"CurrentDocument"準則98:函數(shù)返回類型必須一致。(強制) 41\o"CurrentDocument"準則99:函數(shù)和原型返回類型必須一致。(強制) 42\o"CurrentDocument"準則100:函數(shù)和原型參數(shù)類型必須一致。(強制) 42\o"CurrentDocument"準則101:結構體變量初始化的類型必須一致。(強制) 43\o"CurrentDocument"準則102:結構體變量初始化的嵌套結構必須一致。(強制) 43\o"CurrentDocument"準則103:變量使用前必須被賦值過。(強制) 43\o"CurrentDocument"準則104:注意三重表達式中的類型匹配。(推薦) 44\o"CurrentDocument"準則105:賦值類型必須匹配。(強制) 44\o"CurrentDocument"準則106:數(shù)組下標必須是整型。(強制) 44準則107:盡量不使用單行注釋‘ソ/"。(推薦) 45\o"CurrentDocument"準則108:用typedef自定義的類型名禁止被重新定義。(強制) 45\o"CurrentDocument"準則109:謹慎在源程序中使用非;隹則字符。(推薦) 45\o"CurrentDocument"準則110:禁止表達式不是邏輯表達式。(強制) 46\o"CurrentDocument"準則111禁止不要使用不正確的終止字符串。(強制) 46\o"CurrentDocument"準則112:禁止局部變量與全局變量同名。(強制) 46\o"CurrentDocument"準則113:禁止對常數(shù)值做邏輯非的運算。(強制) 47準則114:main函數(shù)必須為int(void)或int(int,char?口)。(強制) 47\o"CurrentDocument"準則115:禁止使用嵌套的注譯。(強制) 48\o"CurrentDocument"準則116:禁止對有符號類型使用位運算。(強制) 48\o"CurrentDocument"準則117:switch語句中的表達式禁止是邏輯表達式。(強制) 48準則118:謹慎使用abort,exit等函數(shù)。(推薦) 49\o"CurrentDocument"準則119:禁止枚舉類型的越現(xiàn)使用。(強制) 49\o"CurrentDocument"準則120:變量的使用禁止超出所定義的范圍(強制) 50\o"CurrentDocument"準則121:謹慎在宏中使用“##"或“#"。(推薦) 50\o"CurrentDocument"準則122:禁止在同一個文件中有#if而沒有#endif。(強制) 50\o"CurrentDocument"準則123:禁止數(shù)組沒有邊界限定。(強制) 50\o"CurrentDocument"準則124:禁止參數(shù)與全局變量同名。(強制) 51\o"CurrentDocument"準則125:禁止參數(shù)與類型或標識符同名。(強制) 51\o"CurrentDocument"準則126:禁止在#includev >中使用絕對路徑名。(強制) 52\o"CurrentDocument"準則127:禁止在內(nèi)部塊中重新使用某名字。(強制) 52\o"CurrentDocument"準則128:禁止在邏輯表達式中使用賦值操作符。(強制) 52\o"CurrentDocument"準則129:禁止賦值操作符與“&&”或“ド連用。(強制) 53\o"CurrentDocument"準則130:禁止在復雜的表達式中使用volatile類型的變量。(強制) 53\o"CurrentDocument"準則131:避免使用老的參數(shù)表定義形式。(推薦) 54\o"CurrentDocument"準則132:禁止位操作符帶有布爾型的操作數(shù)。(強制) 54\o"CurrentDocument"準則133:禁止位操作符作用干布爾值。(強制) 55\o"CurrentDocument"準則134:禁止在結構體中使用無名位域。(強制) 55\o"CurrentDocument"準則135:避免由于設計的原因導致某些代碼不能執(zhí)行。(推薦) 55\o"CurrentDocument"準則136:避免無法控制的循環(huán)條件。(推薦) 56\o"CurrentDocument"準則137:禁止結構體聲明不完整。(強制) 56\o"CurrentDocument"準則138:禁止參數(shù)的聲明形式上不一致。(強制) 56\o"CurrentDocument"準則139:禁止變量在定義前被使用。(強制) 57\o"CurrentDocument"準則140:字符串數(shù)組的賦值必須再所分配的空間之內(nèi)。(強制) 57\o"CurrentDocument"準則141:枚舉類型的變量的成員必須初始化為整型。(強制) 57\o"CurrentDocument"準則142:禁止將枚舉類型變量用作算術操作的操作數(shù)。(強制) 58\o"CurrentDocument"準則143:避免對無符號數(shù)進行大于等于零或小于零的比較。(推薦) 58\o"CurrentDocument"準則144:避免聲明了標號但不使用的情況。(推薦) 59\o"CurrentDocument"準則145:避免當switch語句的表達式是枚舉類型時缺少case分支。(推薦) 59\o"CurrentDocument"準則146:禁止移位操作符中的右操作數(shù)為負數(shù)。(強制) 59\o"CurrentDocument"準則147:禁止sizeof操作符的操作數(shù)是類型。(強制) 60\o"CurrentDocument"準則148:禁止sizeof的參數(shù)是數(shù)組類型的函數(shù)參數(shù)。(強制) 60\o"CurrentDocument"準則149:禁止聲明為數(shù)組的形式參數(shù)有固定的大小。(強制) 60\o"CurrentDocument"準則150:禁止聲明的函數(shù)參數(shù)類型不完整。(強制) 61\o"CurrentDocument"準則151:禁止&&、II或!操作符的操作數(shù)不是布爾型。(強制) 61\o"CurrentDocument"準則152:禁止兩個布爾型變量進行比較。(強制) 61\o"CurrentDocument"準則153:禁止函數(shù)、變量或常量使用不同的類型重定義。(強制) 62\o"CurrentDocument"準則154:禁止引用空指針。(強制) 62準則155:禁止在存儲空間釋放后再使用該存儲空間。(強制) 63\o"CurrentDocument"準則156:分配存儲空間在返回或退出活動范圍時必須釋放。(強制) 63\o"CurrentDocument"準則157:禁止引用堆棧,即當函數(shù)返回時ー個外部變量指向堆棧區(qū)。(強制) 63\o"CurrentDocument"準則158:禁止修改或釋放字符串常量。(強制) 64\o"CurrentDocument"準則159:禁止聲明了函數(shù)、變量或常量等,但是在程序中未被使用的情況。(推薦) 64\o"CurrentDocument"準則160:數(shù)組的初始化必須完整。(強制) 65\o"CurrentDocument"準則161:禁止聲明了類型但未使用的情況。(推薦) 65\o"CurrentDocument"準則162:禁止對同一函數(shù)作多次定義。(強制) 65\o"CurrentDocument"準則163:禁止對同一函數(shù)作多次聲明。(強制) 66\o"CurrentDocument"準則164:禁止在函數(shù)體內(nèi)使用外部聲明。(強制) 66\o"CurrentDocument"準則165:禁止局部變量與全局變量重名。(強制) 66\o"CurrentDocument"準則166:禁止函數(shù)、變量或常量聲明了但未定義的情況。(強制) 67附錄A與MISRA和LDRA標準的對應關系 68附錄B準則分類索引 731背景說明依據(jù)第一版的試用情況,第二版修改了若干條準則,包括刪除了4條準則,并進行了替換,新補充了28條準則(準則139—準則166).2背景說明1998年,國際發(fā)動機エ業(yè)軟件可靠性協(xié)會MISRA(MotorIndustrySoftwareReliabilityAssociation)組織制定了“汽車軟件C語言使用指南”的標準。這份標準的產(chǎn)生莊自動化行業(yè)極大地推動了使用“安全的C”進行編程。這份標準在汽車行業(yè)被廣泛接受,同時它也被其它行業(yè)所廣泛借鑒。利物浦數(shù)據(jù)研究協(xié)會LDRA(LiverpoolDataresearchAssocia5es)作為專業(yè)軟件測試協(xié)會建立于!975年。LDRATestbed軟件測試工具可基于MISRA的C語言使用標準對C語言程序進行檢査,以幫助用戶們在程序代碼上加強行業(yè)際準的執(zhí)行。本標準是在MISRA和LDRA的標準基礎上,結合我國軍エ軟件開發(fā)實際情況,進行適當裁剪和修訂而形成的。木標準的準則分為推薦和強制兩種類型,所有準則都經(jīng)過了ViSUalC++的編譯實驗,對VisualC++編譯器能識別的準則部進行了注釋說明。3參考資料[1J^GuidelinesForTheUseOfTheCLanguageInVehicleBasedSoftware》,MISRA,1998.[2]?LDRATestbedandMISRACChecking》,@2000LDRALtd,Version2.0.4準則細則準則1:對基本類型聲明和使用。(推薦)在不同的編譯程序中基本類型的長度是大不相同的,因此鼓勵在統(tǒng)ー的ー個變量聲明頭文件中使用typedef定義軟件使用的變量類型,而在除此之外的程序中禁止使用基本類型的聲明。這條準則是為了使代碼易于移植。例如,在頭文件c_standards.h中定義:typedefunsignedintUINT_32;typedfintSINT_32;typedefunsignedshort.typedefunsignedcharUCHAR;typedeffloatFLOAT_32;typedefdoubleFLOAT_64;在程序中旳使用如下:#include"c_standards.h"voidp(void)UINT_32i=ou;FLOAT_32x=O.Of;準則2:過程名禁止被重用。(強制)ー個過程名禁止波重用于其它之處。例如:#include"c_standards.h"voidfoo(UINT32Pl)UINT_32x=p_l:)?準則2:過程名靜止被重用。voidstatic_p(void)UINT_32foo=lu;|準則3:標號名禁止被重用。(強制)ー個標號名禁止被重用并且掩蓋了這個標號名的含義。出現(xiàn)這種情況時,編譯是否通過是依賴于編譯程序的不同而不同的。例如: #include4<c_standarda.hM?準則3:標號名禁止被重用。voidstatic_p(void){UINT_32value_x=lu;UINT_32y=ou;/**/準則4:ー個文件中的程序總行一般不得超過2000行。(參考)這個準則使管理者可以控制每個文件中的代碼總數(shù)。準則5:ー個過程(函數(shù)、子程序)中的程序總行一般不得超過200行。(參考)準則使管理者可以控制過程的大小,且便于單元測試。準則6:嚴格審査條件判別的then分支中無任何執(zhí)行語句的情況。(強制)then分支中無任何執(zhí)行語句,可能是由于遺漏掉了或是有意避免布爾表達式不成立時的情況??梢钥偨Y為下面幾種形式:if(...)elseif(...){;}elseif(...){;}else#include“c_standards.h"?準則6:條件判別的then分支中無任何執(zhí)行語句的情況。voidstaticp(void)UINT_32valie_x=lu;/**]if(value_x==ou){ifFALSEvalue_x=value_x+lu;endif}/**/if(value_x==ou){;}J 注:VisualC++編譯器,對“if(??.):"情況編譯報警。準則7:嚴禁將過程聲明為指針類型。(強制)使用過程指針是很危險的,必須嚴格控制。例如: include"cstandards.h"voidfoo(UINT_32P_l,UINT_16P_2){/*……*/)?準則7:嚴禁將過程聲明為指針類型.voidstatic_p(void)(void(*proc_pointer)(UINT_32,UINT_16)=foo;porc_pointer(lu,1);/**/準則8:禁止直接從過程中跳出。(強制)這種情況的出現(xiàn)是依賴于編譯程序的,但一般是由于使用了setjmpo例如:include<setjmp.h>include44c_standars.h,'準則8:禁止直接從過程中跳出.staticvoidstatic_p(jmp_bufmark,UINT_32val)(lomgjmp(mark,val);準則9:嚴格審査條件判別的else分支中無任何執(zhí)行語句的情況。(強制)else中無語句是由于代碼不完整或是由于為了表明else中的那種可能性已經(jīng)考慮到了,可以總結為下面幾種形式:else;else{}else{;}例如:#include“c_standards.h"*準則9:條件判別的else分支中無任何執(zhí)行語句的情況.voidstatic_p(coid){UINR32namex=lu;/* *9If(name_x==ou){/*...*/)else;/*...*/if(name_x==ou){/*...*/)else(#ifFALSEname_x=name_x+lu;#endif)/*...*/if(name_x==ou){/*...*/)else{;})準則10:禁止在非賦值表達式中出現(xiàn)了賦值操作符。(強制)”,這會引起”,這會引起例如:#inclue"c_standards.h"?準則10:禁止在非賦值表達式中出現(xiàn)了賦值操作符。voidstatic__p(void)(UINT_32Z=ou,x=ou;Boolf;ag=true;/*...*/If(flag=false)Z=x-lu;}/*...*/準則11:過程體必須用大括號括起來。(強制)受約束的語句使用大括號是出于維護的目的。準則12:循環(huán)體必須用大括號括起來。(強制)受約束的語句使用大括號是出于維護的目的。例如:#include"c_standards.h"?準則12:循環(huán)體必須用大括號括起來。SINT_32static_p(SLNT_32p_1)(SINT_32J=10;SINT_32k=0;/*...*/for(k=0;k<10;k=k+1)j—;returnj;準則13:then/else中的語句必須用大括號括起來。(強制)受約束的語句使用大括號是出于維護的目的。例如:#include"c_standards.h''?準則13:then/else中的語句必須用大括號括起來。SINT_32static一p(SINT_32p_l,SINT_32P_2)(SINT_32J=1;SINT_32J=2;/*...*/if(P_l>〇){I=I-1;}else1=1+1;If(P_l>0){J=j+p_2;}elseif(p2<0){j=j-P-2;}else{j=1;}returnI;準則14:盡量避免使用goto語句。(強制)使用goto語句被認為是不好的編程習慣。例如: #include"c_standards.h"?準則14I盡量避免使用goto語句。voidstatic_p(void)(S1NT_32jump_flag=0;/*...*/start;jump_flag++;if(jump_flag<10){gotostart;}準則15:盡量避免將過程定義為參數(shù)。(推薦)將過程定義為參數(shù)可以用來生成代碼。也會使控制流變得不清楚,例如: #include“jstandards.h"voidtest_p(SINT_32p_l){/*...*/}?準則!5:盡量避免將過程定義為參數(shù)voidstatic__p(void(*p_proc_pointer)(SINT_32parameter_1))(p_proc_pointer=test_p;準則16:禁止在結構體定義中含有空域。(強制)通常出現(xiàn)在類似于如ド的情況中:structatag{structanothertag{例如: #include“c_standards.h"準則16:禁止在結構體定義中含有空域。structs_p{UINT_32xs;struct{UCHARac,ab:};}:voidstatic_p(void){structs_psb:sb.xs=1;/*...*/準則17:禁止聲明多重標號。(強制)使用多重標號是多余的,只需要一個。例如: #include"c_standards.h''準則17:禁止聲明多重標號staticvoidstatic_p(void)(start;begin;/*...*/_} 注:VisualC++編譯器,多余的標號編譯報錯。準則18:過程中避免使用過多的參數(shù),最多不要超過20個。(參考)全局變量的使用與參數(shù)的使用之間的協(xié)定是ー個復雜的問題,實參與形象傳遞數(shù)據(jù)要浪費時間,使用全局變量會更快ー些,但使用全局變量會帶來許多副作用。參數(shù)也可以定義在結構體中,這樣可以使過程看起來變得簡潔。例如: .include"c_standards.h"?準則18:過程中避免使用過多的參數(shù),最多不超過10個。voidstatic_p(UINT_32p」,UINT_32P-2,UINT.32P_3,UINT_32P.4,UINT_32P_5,UINT_32p_6,UINT_32P-7,UINT_32P-8,UINT_32P_9,U1NT_32p_10,UINT.32p_l1,UINT_32p_12,UINT_32fP_13,UINT_32P-14,UINT_32P.15i/*...*/}準則19:盡量避免過程參數(shù)在過程調(diào)用中未被使用。(推薦)準則20:參數(shù)必須使用類型聲明。(強制)ー些編譯程序允許缺省參數(shù)類型。例如: include"c_standards.h"?準則20:參數(shù)必須使用類型聲明。UINT_32static_p(p_l)(U1NT_32result;/*...*/result=p_l*2;resultresult;注:VisuaiC++編譯器,編譯報錯。準則21:實參與形參個數(shù)必須一致。(強制)ー些編譯連接忽略實參與形參的個數(shù)檢查。例如: include"c_standards.h"UINT_32test_p(UINT_32p_l,UINT_16p-2)(UINT_32result=ou;I* *,result=p_l+p_2;}?準則21:實參與形參個數(shù)必須一致。voidstatic_p(UINT_32P_l,uint_16p_2)test_p(lu,2,3))注:VisualC++編譯器編譯報錯。準則22:禁止使用一些模糊的語句。(強制)有一些模糊的操作符如:“ヱ”和“=+”。賦值表達式“1=-1”是不同的,很容易混淆。例如: include“jslandards.h"?準則22:禁止使用一些模糊的語句。voidstatic_p(void)(SINT_32b=l,a=0;a=-b;a=+b;)準則23:禁止某個過程在其所在的文件中沒被任何調(diào)用。(強制)ー個文件中有主過程和其它過程,某個過程沒被該文件中的其它任何過程調(diào)用。如果這個文件是系統(tǒng)的一部分,那么這個過程有可能被其它文件所調(diào)用,我們可以把這個過程移到調(diào)用它的那個文件中去。例如: #include“c_standards.h"?準則23:禁止某個過程在其所在的文件中沒被任何調(diào)用。UINT_32static_p(UINT_32p)(UINT_32x=lu;/*...*/X=X+p;returnx:SINT_32main(void)(/*...*/return(o);準則24:盡量避免使用不加以分析的注釋。(推薦)注釋應為功能性的,而非指令的逐句說明,對于源文件中的代碼應該給予分析性的注釋,例如:#include"c_standards.h"?準則24:盡量避免使用不加以分析的注釋。voidstatic_p(void)(UINT_32x=ou;/*...*/X=lu;/*LetxtobeI*/x+x+lu;/*xbecomesxaddI*/準則25S禁止switch語句的case中無語句。(強制)這些case與它后面的case共用ー組執(zhí)行語句。也應該檢查ー下這些case語句后是否漏掉了break語句。例如: #include“c_standards.h"*準則25:禁止switch語句的case中無語句。SINT_32statijp(SINT_32p_l)(SINT_321=0,J=0;/*...*/SWITCH(P_l)(case0:j=o;break;case1;case2;j=I:break;default;I=j+1;)returnI+j;}準則26:使用無限循環(huán)必須嚴格審査。(強制)下面是幾種可以引起無限循環(huán)的簡單情況:for(;;)while(l){...}do...while(l)準則27:禁止返回類型說明為void的過程中有return語句返回值。(強制)如果過程返回類型為void?那么任何return語句不能有返回值。_例如: include"c_standards.h"準則27:禁止返回類型說明為void的過程中有return語句返回值。viodstatic_p(UINT_32P_l,uint_32p_2)(UINT_32result;/*...*/result=p-1+p_2;returnresult;J 注:VisualC卜十編譯器,編譯報錯。準則28:盡量避免使用“+=”或操作符。(推薦)許多專家相信使用這種結構是很危險的。例如: #include"jstandards.h"準則28:盡量避免使用“+=”或“=”操作符。voidstatic_p(void)UINT_32UINT_32UINT_32x=lu;y=2u;Z=3u;bootflag=false;/*...*/x+=1;z+=y;準則29:使用“++”或“--”操作符必須格外小心。(推薦)在表達式中使用這些操作符是很危險的。操作符在變量前的使用稱之為前綴使用,操作符在變量后的使用稱之為后綴使用,這ー準則允許在ー個單獨的表達式或循環(huán)控制中使用它們。這個準則應與準則120聯(lián)系起來考慮,準則120中限定不可以使用它們作為前緩。用戶可以選擇其中一個作為準則.例如: #include"c_standards.h”voidfoo(UINT_32p_x){/*...*/)準則29:使用“++”或操作符必須格外小心。voidstatic_p(void)(UINT_32x=lu;UINT_32y=2u;Boolflag=false;/*...*/if(flag==false){x++;}x=x+y++;foo(x++);)準則30:禁止在循環(huán)中使用break語句。(強制)在循環(huán)中使用break語句使得循環(huán)有多于ー個出口。例如: #include4tc_standrds.hM?準則30:禁止在循環(huán)中使用break語句。voidstatic_p(void)(SINT_321=10;/*...*/while(I>-1){if(I==0){bresk;)=1-1:)}準則31:盡量避免使用continue語句。(強制)使用continue語句不符合結構化程序設計原則。例如: #include“c_slandards.h”準則31:盡量避免使用continue語句。voidstatic_p(SINT_32P_l)(SINT_32I=p_l;SINT_32x=o;/*...*/while(I!=0){1--;If(x==0){Continue;)}}準則32:盡量避免使用三重的表達式。使用三重的表達式會使代碼變得高度復雜,可讀性差。例如: #include“c_standards.h"voidfoo(UINT_32p_l)(/*...*/)準則32:盡量避免使用三重的表達方式voidstatic_p(UINT_32P_1){staticUINT_32typeo=ou;staticUINT_32typel=iu;/*...*/(p_l==0)?foo(typO);foo(typel);}準則33:在過程聲明中必須對參數(shù)說明。(強制)ー個過程或函數(shù)的聲明中沒對參數(shù)類型進行說明。例如: #include"c_standards.h"準則33:在聲明中必須對參數(shù)進行說明。SINT_32static_p();SINT_32static_p(UINT_32p){SINT_32x=1;/*...*/if(p==0){x=0;)reyumx;準則34:返回類型為static的過程在其所在文件中必須被調(diào)用。(強制)如果ー個過程被聲明為static類型的,那么它的作用域為所在文件,若它所在文件中被調(diào)用,可以把它去掉。例如: include"jstandards.h"staticboolstatic_p(UINT_32);準則34:返回類型為static_p(UINT_32p_l)staticboolstatic_p(UINT_32p_l)(boolret=false;UINT_32I=P」+lu;/*....*/if(I==0){ret=true;)returnret;)voidmain(void)準則35:函數(shù)必須有返回語句。(強制)ー個函數(shù)應該有一個返回語句,否則函數(shù)會返回一個隨機數(shù),這個隨機數(shù)通常是推棧頂端值。例如: #include“jstandards.h"準則35:函數(shù)必須有返回語句。UINT_32y=p_l;/*Notreturningavalue*/J 注:VisualC++編譯器,編譯報錯。準則36:禁止過程參數(shù)只有類型沒有標識符。(強制)ー些編譯程序允許參數(shù)有類型而沒有標識符,這樣的參數(shù)并不能真正的使用。列如: #include44c_standards.hvstructs_type_b(UINT__32xs:);準則36:禁止過程參數(shù)只有類型沒有標識符。voidstatic_p_a(UINT_32P_l,structs_type_b*);voidstatic_p_a(UCMT_32p_l,structs_type_b*)準則37:禁止使用不合適的循環(huán)變量類型。(強制)有許多類型不合適用于循環(huán)指標,尤其是實型變量,因為這些數(shù)在循環(huán)執(zhí)行時會得到不可預料的結果。例如:#include"c_standards.h"準則37禁止使用不合適的循環(huán)變量類型。voidstatic_p(void)(FLOAT_32f=O.Of;/????*/for(f=O.Of;f<10.Of;f=f+l.Of){準則38:循環(huán)變量必須是局部聲明的。(強制)循環(huán)變量應該定義在最小的范圍內(nèi),即循環(huán)變量的作用域應最小。例如: #inCludeMCStandards,h”UINT_32global-f:Ou:則38:循環(huán)變量必須是局部聲明的。SINT32loopstandards(SINT32pl)SINT_32j=10;/*...*/for(global_f=0:global_f=global_f+1){j)returnj:)準則39:禁止在過程參數(shù)表中使用省略號。(強制)例如: #inChide”Cstandards,h”#inClude<stdarg.h>準則39:禁止在過程參數(shù)表中使用省略號。UINT_32static_o(UCHAR*p」,?.){vaJiStap;UCHAR*t:/*...*/vastart(ap,p_l);t=va_arg(ap,UCHAR*);/???.vaend(ap):returnlu;)voiddummy(void){static_p((UCHAR*)"xyz'',''s")}準則40:禁止在結構體定義中使用位域。(強制)位域是c中的ー個難點,因為對它的使用規(guī)定不明確。咧如: #include<setjmp.h"準則40:禁止在結定義中使用位域;structbilfieldl(UINT_32x:1:};/* Functionprototypes一?/vOiddummy(vOid)(/*...*/}準則41:盡量避免使用setimp/longjmpo(推薦)使用這些結構會導致包括移植性差的許多困難。例如: #include<setjmp.h>#include,Cstandards,h"準則41:盡量避免使用setjmp/longjmp。staticVOidstatic_p(jmp_bufmark,UINT_32val)(longjmp(mark,val):準則42:禁止使用禁用的過程,函數(shù),文件或名稱。(強制)由于某些原因,許多安裝中禁止使用ー些特殊的項,如:a.庫中的過程或函數(shù):b.庫文件:c特定的名稱。準則43:禁止重新定義使用C關鍵字。(強制)例如: #inClude,CStandards,h"準則43:禁止重新定義使用C++關鍵字vOidStatic_p(vOid))TOC\o"1-5"\h\zUINT_32public =0UINT_32prirate =0UINT_32pyotected =0UINT_32operator =0UINT32new =0UINT_32template=0UINT_32virtual二0UINT_32delete=0UINT_32friend二0UINT_32COUt=0UINT_32cin=0UINT_32endl=0注:VisualC++編譯器,編譯報錯。準則44:禁止在禁止使用extern的文件中使用了extem。(強制)在ー些環(huán)境中使用extern受到嚴格的控制,例如只有特定的頭文件才含有這種類型;例如: #include“jstandards.h"?準則44:禁止在禁止使用extern的文件中使用了extern.externUINT_32undef_global;voidstatic_p(void){undef_global=lu:)準則45:數(shù)組使用必須保證不會出現(xiàn)越界。(強制)通常是ド標超出數(shù)組所指定的范圍。例如: #include"c_standards.h"準則45:數(shù)組使用必須保證不會越界。voidstatic_p(void)UINT_32a[4]/**/a[5]=1/**,準則46:在switch語句中必須有defult語句。(強制)如果switch語句中缺省了default語句,當所有的case語句的表達式值都不匹配時,則會條轉到整個switch語句后的下ー個語句執(zhí)行。加入default語句會體現(xiàn)事先已有所考慮單位編程思想。#include“c_standards.h"準則46:在switch語句中必須有defult語句。voidstatic_p)SINT_32p_l)(SINT_321=0;j=0;/*...*/switch(p_l)(case0;j=0;brease;case1;j=I;break;)/*...*/準則47:邏輯表達式的連接必須使用大括號。(強制)在含有邏輯操作符的表達式中使用括號可使運算循序變得清晰,不容易出錯。例如:#include“c_standards.h"?準則47:邏輯表達式的連接必須使用大括號。viodstatic_p(void){boolflag=true;UINT_32y=ou,x=ou,z=lu;/*...*/if(x<0llz+y!=0&&!flag)(flag=false;)準則48:禁止對有符號類型進行移位運算。(強制)對有符號類型進行移位運算會導致不可預料的后果。例如: #include"c_standards.h^^?準則48:禁止對有符號類型進行移位運算。voidstatic_p(void)(STNT_32b=1;/*...*/b?=1;準則49:對變量進行移位運算必須保證不會產(chǎn)生溢出。(強制)ー些編譯程序不檢查移位運算是否超出機器字長。例如: #include"jstandads.h"?準則49:對變量進行移位運算必須保證不會產(chǎn)生溢出。voidstatic_p(void){UINT_32 x=ou;UINT_32 y=ou;/*....*/x=y?34;準則50:禁止給無符號變量賦負值。(強制)給符號變量賦負值會導致不可預料的結果,這種情況不應該出現(xiàn)。例如:#include''c_standards.h"?準則50:禁止給無符號變量賦負值。voidstaic_p(void)(UINT_32x=lu;UINT_32y=2u;/*...*/y=-x;}注:VisualC++編譯器,編譯報警。準則51:盡量避免使用逗號操作符。(推薦)除非在參數(shù)表或循環(huán)中可以使用逗號操作符,否則會使程序可讀性差。例如: #inClude"c_standards.h"?準則51:盡量避免使用逗號操作符。voidstatic_p(void)(UINT_32x=lu:/*…*/X++, X+=1;準則52:謹防長度操作符sizeof的副作用。(強制)長度操作符sizeof不計算操作數(shù)的值,所以對表達式做長度運算時會得出不能預料的結果。例如: #include"c_standards.h"?準則52:謹防長度操作符sizeof的副作用。voidstatic_o(vOid)(UINT_32x=lu;UINT_32y=lu:SINT_32a=l:/*...*/a=sizeof(x=y);)準則53:禁止同一個表達式中調(diào)用多個的函數(shù)。(強制)可能因為執(zhí)行的順序不同而產(chǎn)生不同的結果。例如: #include**c_standards,h”UINT_32exp_l(UINT_32*p_l)(UINT_32x:*p_l:(*p_l)=x*x;return(x);)UINT_32exp_2(UINT_32*p_l){UINT_32x=*p_l:(*p_l)=(x%2);retum(x);)?準則53:禁止同一個表達式中調(diào)用多個的函數(shù)。voidstatic_p(void)(UINT_32y=3u,x=ou;x=exp_l(&y)+exp_2(&y);J準則54:禁止對實數(shù)類型的量做是否相等的比較。(強制)對實數(shù)類型的量做是否相等的比較是很危險的,會得到不能預料的結果。例如: #inchdellc_standards.h"?準則54:禁止對實數(shù)類型的量做是否相等的比較。voidstatic_p(void){FLOAT_32fl,f2;fl=l.Olf;f2=2.01f:/*...*/if(fl==f2) {/*...*/if(fl==O.Of){fl=fl+0.0If;))準則55:盡量避免使用不起作用的語句。(推薦)這種語句沒有改變局部或全局變量的值,也沒有影響控制流。例如: #include44c_standards.h"?準則55:盡量避免使用不起作用的語句。voidstatic_p(void){UINT_32x=0u;X:J準則56:盡量避免使用空語句。(推薦)C語言是允許使用空語句的,但有些編譯程序不能處理空語句,所以建議不要使用它。例如: #include"c_standards.h"準則56:盡量避免使用空語句。voidstatic_p(void)(UINT_32Timing_Loop=lOOu:/*...*/Timlng_Loop—;;準則57:在if語句中應有else分支。(推薦)在if語句中的else分支可以是不起作用的,可以只是為了表示else那種情況已經(jīng)考慮到了。'列如: #include“cstandards.h"準則57:在if語句中應有else分支。***東**********************************************voidstatic_p(void)UINT_32x=2u:/*...*/if(x==2u){/*...*/}elseif(x==3u){/*...*/)準則58:禁止switch語句中為空。(強制)例如: #includenc_Standards.h"準則58:禁止switch語句中為空。voidStatic_p(SINT—32p—1){SINT_32I=pj:switch(1)())注:VisualC++編譯器,編譯報警。準則59:禁止switch語句中只包含default語句。(強制)例如: #include“jstandards.h"準則59:禁止switch語句中只包含default語句。voidstatic_p(SINT_32p_l)STNT_32i=p_l;switch(i)default;1++:)}注:ViSUalC++編譯器,編譯報警。準則60Z禁止switch語句中的case語句沒有由break終止的。(強制)如果某個case語句最后的break被省略,在執(zhí)行完該case語句后,系統(tǒng)會繼續(xù)執(zhí)行下ー個case語句,要防止這種情況出現(xiàn)需要使用break語句或其他的跳轉控制。例如: #includenc_standards.h"準則60I禁止switch語句中的case語句沒有由break終止的。voidstatic_p(SINT_32p_l)(SINT_32i=0,j=0;switch(p_l)(case0;j=0:caseI;j=i:break;default:i=j+I;準則61:禁止procedure/function(過程/函數(shù))中參數(shù)表為空。(強制)這ー準則建議不要使用func()形式,而使用func(void)形式。例如:#inC!UdeCStandards,h”準則61:禁止procedure/fUriction(過程/函數(shù))中參數(shù)表為空,voidsatic_p()(/*...*/返回類型說明為void的過程用在表達式中是危險的,這一點依賴于編譯器。例如: #includenc_standards.h"voidfoo(void)(/*...*/)?準則62:禁止返回類型說明為void的過程用在表達式中。voidstatic_p(void){charx;x=(cbar)foo();}注:VisualC++編譯器,編譯報錯。準則63:禁止void類型的變量作為參數(shù)進行傳遞。(強制)傳遞void類型的參數(shù)會導致不可預料的結果,應該避免。例如: #includenc_standards.h"voidvoid_para_func(void*p_l)(/*...*/)?準則63:禁止void類型的變量作為參數(shù)進行傳遞。voidstatic_p(UINT_32p_LUINT_16p_2)(SINT_32y=0;void*vptr=&y;y=(SINT_32)(p_l+p_2);void_para_func(v_ptr);)準則64:禁止函數(shù)中只有一個return空語句而沒有返回值。(強制)只有return語句而無具體指定值,此時返回一個隨機數(shù)。例如: #includenc_standard

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論