編寫高質(zhì)量代碼:改善C程序代碼的125個(gè)建議_第1頁
編寫高質(zhì)量代碼:改善C程序代碼的125個(gè)建議_第2頁
編寫高質(zhì)量代碼:改善C程序代碼的125個(gè)建議_第3頁
編寫高質(zhì)量代碼:改善C程序代碼的125個(gè)建議_第4頁
編寫高質(zhì)量代碼:改善C程序代碼的125個(gè)建議_第5頁
已閱讀5頁,還剩1515頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

編寫高質(zhì)量代碼改善C程序代碼的125個(gè)建議目錄\h第1章數(shù)據(jù),程序設(shè)計(jì)之根本\h建議1:認(rèn)識(shí)ANSIC\h建議2:防止整數(shù)類型產(chǎn)生回繞與溢出\h建議2-1:char類型變量的值應(yīng)該限制在signedchar與unsignedchar的交集范圍內(nèi)\h建議2-2:使用顯式聲明為signedchar或unsignedchar的類型來執(zhí)行算術(shù)運(yùn)算\h建議2-3:使用rsize_t或size_t類型來表示一個(gè)對(duì)象所占用空間的整數(shù)值單位\h建議2-4:禁止把size_t類型和它所代表的真實(shí)類型混用\h建議2-5:小心使用無符號(hào)類型帶來的陷阱\h建議2-6:防止無符號(hào)整數(shù)回繞\h建議2-7:防止有符號(hào)整數(shù)溢出\h建議3:盡量少使用浮點(diǎn)類型\h建議3-1:了解IEEE754浮點(diǎn)數(shù)\h建議3-2:避免使用浮點(diǎn)數(shù)進(jìn)行精確計(jì)算\h建議3-3:使用分?jǐn)?shù)來精確表達(dá)浮點(diǎn)數(shù)\h建議3-4:避免直接在浮點(diǎn)數(shù)中使用“==”操作符做相等判斷\h建議3-5:避免使用浮點(diǎn)數(shù)作為循環(huán)計(jì)數(shù)器\h建議3-6:盡量將浮點(diǎn)運(yùn)算中的整數(shù)轉(zhuǎn)換為浮點(diǎn)數(shù)\h建議4:數(shù)據(jù)類型轉(zhuǎn)換必須做范圍檢查\h建議4-1:整數(shù)轉(zhuǎn)換為新類型時(shí)必須做范圍檢查\h建議4-2:浮點(diǎn)數(shù)轉(zhuǎn)換為新類型時(shí)必須做范圍檢查\h建議5:使用有嚴(yán)格定義的數(shù)據(jù)類型\h建議6:使用typedef來定義類型的新別名\h建議6-1:掌握typedef的4種應(yīng)用形式\h建議6-2:小心使用typedef帶來的陷阱\h建議6-3:typedef不同于#define\h建議7:變量聲明應(yīng)該力求簡潔\h建議7-1:盡量不要在一個(gè)聲明中聲明超過一個(gè)的變量\h建議7-2:避免在嵌套的代碼塊之間使用相同的變量名\h建議8:正確地選擇變量的存儲(chǔ)類型\h建議8-1:定義局部變量時(shí)應(yīng)該省略auto關(guān)鍵字\h建議8-2:慎用extern聲明外部變量\h建議8-3:不要混淆static變量的作用\h建議8-4:盡量少使用register變量\h建議9:盡量不要在可重入函數(shù)中使用靜態(tài)(或全局)變量\h建議10:盡量少使用全局變量\h建議11:盡量使用const聲明值不會(huì)改變的變量\h第2章保持嚴(yán)謹(jǐn)?shù)某绦蛟O(shè)計(jì),一切從表達(dá)式開始做起\h建議12:盡量減少使用除法運(yùn)算與求模運(yùn)算\h建議12-1:用倒數(shù)相乘來實(shí)現(xiàn)除法運(yùn)算\h建議12-2:使用牛頓迭代法求除數(shù)的倒數(shù)\h建議12-3:用減法運(yùn)算來實(shí)現(xiàn)整數(shù)除法運(yùn)算\h建議12-4:用移位運(yùn)算實(shí)現(xiàn)乘除法運(yùn)算\h建議12-5:盡量將浮點(diǎn)除法轉(zhuǎn)化為相應(yīng)的整數(shù)除法運(yùn)算\h建議13:保證除法和求模運(yùn)算不會(huì)導(dǎo)致除零錯(cuò)誤\h建議14:適當(dāng)?shù)厥褂梦徊僮鱽硖岣哂?jì)算效率\h建議14-1:盡量避免對(duì)未知的有符號(hào)數(shù)執(zhí)行位操作\h建議14-2:在右移中合理地選擇0或符號(hào)位來填充空出的位\h建議14-3:移位的數(shù)量必須大于等于0且小于操作數(shù)的位數(shù)\h建議14-4:盡量避免在同一個(gè)數(shù)據(jù)上執(zhí)行位操作與算術(shù)運(yùn)算\h建議15:避免操作符混淆\h建議15-1:避免“=”與“==”混淆\h建議15-2:避免“|”與“||”混淆\h建議15-3:避免“&”與“&&”混淆\h建議16:表達(dá)式的設(shè)計(jì)應(yīng)該兼顧效率與可讀性\h建議16-1:盡量使用復(fù)合賦值運(yùn)算符\h建議16-2:盡量避免編寫多用途的、太復(fù)雜的復(fù)合表達(dá)式\h建議16-3:盡量避免在表達(dá)式中使用默認(rèn)的優(yōu)先級(jí)\h第3章程序控制語句應(yīng)該保持簡潔高效\h建議17:if語句應(yīng)該盡量保持簡潔,減少嵌套的層數(shù)\h建議17-1:先處理正常情況,再處理異常情況\h建議17-2:避免“懸掛”的else\h建議17-3:避免在if/else語句后面添加分號(hào)“;”\h建議17-4:對(duì)深層嵌套的if語句進(jìn)行重構(gòu)\h建議18:謹(jǐn)慎0值比較\h建議18-1:避免布爾型與0或1進(jìn)行比較\h建議18-2:整型變量應(yīng)該直接與0進(jìn)行比較\h建議18-3:避免浮點(diǎn)變量用“==”或“!=”與0進(jìn)行比較\h建議18-4:指針變量應(yīng)該用“==”或“!=”與NULL進(jìn)行比較\h建議19:避免使用嵌套的“?:”\h建議20:正確使用for循環(huán)\h建議20-1:盡量使循環(huán)控制變量的取值采用半開半閉區(qū)間寫法\h建議20-2:盡量使循環(huán)體內(nèi)工作量達(dá)到最小化\h建議20-3:避免在循環(huán)體內(nèi)修改循環(huán)變量\h建議20-4:盡量使邏輯判斷語句置于循環(huán)語句外層\h建議20-5:盡量將多重循環(huán)中最長的循環(huán)放在最內(nèi)層,最短的循環(huán)放在最外層\h建議20-6:盡量將循環(huán)嵌套控制在3層以內(nèi)\h建議21:適當(dāng)?shù)厥褂貌⑿写a來優(yōu)化for循環(huán)\h建議22:謹(jǐn)慎使用do/while與while循環(huán)\h建議22-1:無限循環(huán)優(yōu)先選用for(;;),而不是while(1)\h建議22-2:優(yōu)先使用for循環(huán)替代do/while與while循環(huán)\h建議23:正確地使用switch語句\h建議23-1:不要忘記在case語句的結(jié)尾添加break語句\h建議23-2:不要忘記在switch語句的結(jié)尾添加default語句\h建議23-3:不要為了使用case語句而刻意構(gòu)造一個(gè)變量\h建議23-4:盡量將長的switch語句轉(zhuǎn)換為嵌套的switch語句\h建議24:選擇合理的case語句排序方法\h建議24-1:盡量按照字母或數(shù)字順序來排列各條case語句\h建議24-2:盡量將情況正常的case語句排在最前面\h建議24-3:盡量根據(jù)發(fā)生頻率來排列各條case語句\h建議25:盡量避免使用goto語句\h建議26:區(qū)別continue與break語句\h第4章函數(shù)同樣需要保持簡潔高效\h建議27:理解函數(shù)聲明\h建議28:理解函數(shù)原型\h建議29:盡量使函數(shù)的功能單一\h建議30:避免把沒有關(guān)聯(lián)的語句放在一個(gè)函數(shù)中\(zhòng)h建議31:函數(shù)的抽象級(jí)別應(yīng)該在同一層次\h建議32:盡可能為簡單功能編寫函數(shù)\h建議33:避免多段代碼重復(fù)做同一件事情\h建議34:盡量避免編寫不可重入函數(shù)\h建議34-1:避免在函數(shù)中使用static局部變量\h建議34-2:避免函數(shù)返回指向靜態(tài)數(shù)據(jù)的指針\h建議34-3:避免調(diào)用任何不可重入函數(shù)\h建議34-4:對(duì)于全局變量,應(yīng)通過互斥信號(hào)量(即P、V操作)或者中斷機(jī)制等方法來保證函數(shù)的線程安全\h建議34-5:理解可重入函數(shù)與線程安全函數(shù)之間的關(guān)系\h建議35:盡量避免設(shè)計(jì)多參數(shù)函數(shù)\h建議35-1:沒有參數(shù)的函數(shù)必須使用void填充\h建議35-2:盡量避免在非調(diào)度函數(shù)中使用控制參數(shù)\h建議35-3:避免將函數(shù)的參數(shù)作為工作變量\h建議35-4:使用const防止指針類型的輸入?yún)?shù)在函數(shù)體內(nèi)被意外修改\h建議36:沒有返回值的函數(shù)應(yīng)聲明為void類型\h建議37:確保函數(shù)體的“入口”與“出口”安全性\h建議37-1:盡量在函數(shù)體入口處對(duì)參數(shù)做有效性檢查\h建議37-2:盡量在函數(shù)體出口處對(duì)return語句做安全性檢查\h建議38:在調(diào)用函數(shù)時(shí),必須對(duì)返回值進(jìn)行判斷,同時(shí)對(duì)錯(cuò)誤的返回值還要有相應(yīng)的錯(cuò)誤處理\h建議39:盡量減少函數(shù)本身或者函數(shù)間的遞歸調(diào)用\h建議40:盡量使用inline內(nèi)聯(lián)函數(shù)來替代#define宏\h第5章不會(huì)使用指針的程序員是不合格的\h建議41:理解指針變量的存儲(chǔ)實(shí)質(zhì)\h建議42:指針變量必須初始化\h建議43:區(qū)別“int*p=NULL”和“*p=NULL”\h建議44:理解空(null)指針與NULL指針\h建議44-1:區(qū)別空(null)指針與NULL指針的概念\h建議44-2:用NULL指針終止對(duì)遞歸數(shù)據(jù)結(jié)構(gòu)的間接引用\h建議44-3:用NULL指針作函數(shù)調(diào)用失敗時(shí)的返回值\h建議44-4:用NULL指針作警戒值\h建議44-5:避免對(duì)NULL指針進(jìn)行解引用\h建議45:謹(jǐn)慎使用void指針\h建議45-1:避免對(duì)void指針進(jìn)行算術(shù)操作\h建議45-2:如果函數(shù)的參數(shù)可以是任意類型指針,應(yīng)該將其參數(shù)聲明為void*\h建議46:避免使用指針的長度確定它所指向類型的長度\h建議47:避免把指針轉(zhuǎn)換為對(duì)齊要求更嚴(yán)格的指針類型\h建議48:避免將一種類型的操作符應(yīng)用于另一種不兼容的類型\h建議49:謹(jǐn)慎指針與整數(shù)之間的轉(zhuǎn)換\h建議50:區(qū)別“constint*p”與“int*constp”\h建議51:深入理解函數(shù)參數(shù)的傳遞方式\h建議51-1:理解函數(shù)參數(shù)的傳遞過程\h建議51-2:掌握函數(shù)的參數(shù)傳遞方式\h建議51-3:如果函數(shù)的參數(shù)是指針,避免用該指針去申請(qǐng)動(dòng)態(tài)內(nèi)存\h建議51-4:盡量避免使用可變參數(shù)\h第6章數(shù)組并非指針\h建議52:理解數(shù)組的存儲(chǔ)實(shí)質(zhì)\h建議52-1:理解數(shù)組的存儲(chǔ)布局\h建議52-2:理解&a[0]和&a的區(qū)別\h建議52-3:理解數(shù)組名a作為右值和左值的區(qū)別\h建議53:避免數(shù)組越界\h建議53-1:盡量顯式地指定數(shù)組的邊界\h建議53-2:對(duì)數(shù)組做越界檢查,確保索引值位于合法的范圍之內(nèi)\h建議53-3:獲取數(shù)組的長度時(shí)不要對(duì)指針應(yīng)用sizeof操作符\h建議54:數(shù)組并非指針\h建議55:理解數(shù)組與指針的可交換性\h建議56:禁止將一個(gè)指向非數(shù)組對(duì)象的指針加上或減去一個(gè)整數(shù)\h建議57:禁止對(duì)兩個(gè)并不指向同一個(gè)數(shù)組的指針進(jìn)行相減或比較\h建議58:若結(jié)果值并不引用合法的數(shù)組元素,不要將指針加上或減去一個(gè)整數(shù)\h建議59:細(xì)說緩沖區(qū)溢出\h建議60:區(qū)別指針數(shù)組和數(shù)組指針\h建議61:深入理解數(shù)組參數(shù)\h第7章結(jié)構(gòu)、位域和枚舉\h建議62:結(jié)構(gòu)體的設(shè)計(jì)要遵循簡單、單一原則\h建議62-1:盡量使結(jié)構(gòu)體的功能單一\h建議62-2:盡量減小結(jié)構(gòu)體間關(guān)系的復(fù)雜度\h建議62-3:盡量使結(jié)構(gòu)體中元素的個(gè)數(shù)適中\(zhòng)h建議62-4:合理劃分與改進(jìn)結(jié)構(gòu)體以提高空間效率\h建議63:合理利用結(jié)構(gòu)體內(nèi)存對(duì)齊原理來提高程序效率\h建議64:結(jié)構(gòu)體的長度不一定等于各個(gè)成員的長度之和\h建議65:避免在結(jié)構(gòu)體之間執(zhí)行逐字節(jié)比較\h建議66:謹(jǐn)慎使用位域\h建議67:謹(jǐn)慎使用枚舉\h建議68:禁止在位域成員上調(diào)用offsetof宏\h建議69:深入理解結(jié)構(gòu)體數(shù)組和結(jié)構(gòu)體指針\h第8章字符與字符串\h建議70:不要忽視字符串的null('\0')結(jié)尾符\h建議70-1:正確認(rèn)識(shí)字符數(shù)組和字符串\h建議70-2:字符數(shù)組必須能夠同時(shí)容納字符數(shù)據(jù)和null結(jié)尾符\h建議70-3:謹(jǐn)慎字符數(shù)組的初始化\h建議71:盡量使用const指針來引用字符串常量\h建議72:區(qū)別strlen函數(shù)與sizeof運(yùn)算符\h建議73:在使用不受限制的字符串函數(shù)時(shí),必須保證結(jié)果字符串不會(huì)溢出內(nèi)存\h建議73-1:避免字符串拷貝發(fā)生溢出\h建議73-2:區(qū)別串拷貝strcpy與內(nèi)存拷貝memcpy\h建議73-3:避免strcpy與memcpy函數(shù)內(nèi)存重疊\h建議73-4:區(qū)別字符串比較與內(nèi)存比較\h建議73-5:避免strcat函數(shù)發(fā)生內(nèi)存重疊與溢出\h建議74:謹(jǐn)慎strtok函數(shù)的不可重入性\h建議75:掌握字符串查找技術(shù)\h建議75-1:使用strchr與strrchr函數(shù)查找單個(gè)字符\h建議75-2:使用strpbrk函數(shù)查找多個(gè)字符\h建議75-3:使用strstr函數(shù)查找一個(gè)子串\h建議75-4:區(qū)別strspn與strcspn函數(shù)\h第9章文件系統(tǒng)\h建議76:謹(jǐn)慎使用printf和scanf函數(shù)\h建議77:謹(jǐn)慎文件打開操作\h建議77-1:正確指定fopen的mode參數(shù)\h建議77-2:必須檢查fopen函數(shù)的返回值\h建議77-3:盡量避免重復(fù)打開已經(jīng)被打開的文件\h建議77-4:區(qū)別fopen與fopen_s函數(shù)\h建議77-5:區(qū)別fopen與freopen函數(shù)\h建議78:文件操作完成后必須關(guān)閉\h建議79:正確理解EOF宏\h建議80:盡量使用feof和ferror檢測(cè)文件結(jié)束和錯(cuò)誤\h建議81:盡量使用fgets替換gets函數(shù)\h建議82:盡量使用fputs替換puts函數(shù)\h建議83:合理選擇單個(gè)字符讀寫函數(shù)\h建議84:區(qū)別格式化讀寫函數(shù)\h建議84-1:區(qū)別printf/scanf、fprintf/fscanf和sprintf/sscanf\h建議84-2:盡量使用snprintf替代sprintf函數(shù)\h建議84-3:區(qū)別vprintf/vscanf、vfprintf/vfscanf、vsprintf/vsscanf和vsnprintf\h建議85:盡量使用fread與fwrite函數(shù)來讀寫二進(jìn)制文件\h建議86:盡量使用fseek替換rewind函數(shù)\h建議87:盡量使用setvbuf替換setbuf函數(shù)\h建議88:謹(jǐn)慎remove函數(shù)刪除已打開的文件\h建議89:謹(jǐn)慎rename函數(shù)重命名已經(jīng)存在的文件\h第10章預(yù)處理器\h建議90:謹(jǐn)慎宏定義\h建議90-1:在使用宏定義表達(dá)式時(shí)必須使用完備的括號(hào)\h建議90-2:盡量消除宏的副作用\h建議90-3:避免使用宏創(chuàng)建一種“新語言”\h建議91:合理地選擇函數(shù)與宏\h建議92:盡量使用內(nèi)聯(lián)函數(shù)代替宏\h建議93:掌握預(yù)定義宏\h建議94:謹(jǐn)慎使用“#include”\h建議94-1:區(qū)別“#include”與“#include"filename.h"”\h建議94-2:必須保證頭文件名稱的唯一性\h建議95:掌握條件編譯指令\h建議95-1:使用“#ifndef/#define/#endif”防止頭文件被重復(fù)引用\h建議95-2:使用條件編譯指令實(shí)現(xiàn)源代碼的部分編譯\h建議95-3:妙用“defined”\h建議96:盡量避免在一個(gè)函數(shù)塊中單獨(dú)使用“#define”或“#undef”\h第11章斷言與異常處理\h建議97:謹(jǐn)慎使用斷言\h建議97-1:盡量利用斷言來提高代碼的可測(cè)試性\h建議97-2:盡量在函數(shù)中使用斷言來檢查參數(shù)的合法性\h建議97-3:避免在斷言表達(dá)式中使用改變環(huán)境的語句\h建議97-4:避免使用斷言去檢查程序錯(cuò)誤\h建議97-5:盡量在防錯(cuò)性程序設(shè)計(jì)中使用斷言來進(jìn)行錯(cuò)誤報(bào)警\h建議97-6:用斷言保證沒有定義的特性或功能不被使用\h建議97-7:謹(jǐn)慎使用斷言對(duì)程序開發(fā)環(huán)境中的假設(shè)進(jìn)行檢查\h建議98:謹(jǐn)慎使用errno\h建議98-1:調(diào)用errno之前必須先將其清零\h建議98-2:避免重定義errno\h建議98-3:避免使用errno檢查文件流錯(cuò)誤\h建議99:謹(jǐn)慎使用函數(shù)的返回值來標(biāo)志函數(shù)是否執(zhí)行成功\h建議100:盡量避免使用goto進(jìn)行出錯(cuò)跳轉(zhuǎn)\h建議101:盡量避免使用setjmp與longjmp組合\h第12章內(nèi)存管理\h建議102:淺談程序的內(nèi)存結(jié)構(gòu)\h建議103:淺談堆和棧\h建議104:避免錯(cuò)誤分配內(nèi)存\h建議104-1:對(duì)內(nèi)存分配函數(shù)的返回值必須進(jìn)行檢查\h建議104-2:內(nèi)存資源的分配與釋放應(yīng)該限定在同一模塊或者同一抽象層內(nèi)進(jìn)行\(zhòng)h建議104-3:必須對(duì)內(nèi)存分配函數(shù)的返回指針進(jìn)行強(qiáng)制類型轉(zhuǎn)換\h建議104-4:確保指針指向一塊合法的內(nèi)存\h建議104-5:確保為對(duì)象分配足夠的內(nèi)存空間\h建議104-6:禁止執(zhí)行零長度的內(nèi)存分配\h建議104-7:避免大型的堆棧分配\h建議104-8:避免內(nèi)存分配成功,但并未初始化\h建議105:確保安全釋放內(nèi)存\h建議105-1:malloc等內(nèi)存分配

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論