《高質(zhì)量編程規(guī)范》ppt課件_第1頁
《高質(zhì)量編程規(guī)范》ppt課件_第2頁
《高質(zhì)量編程規(guī)范》ppt課件_第3頁
《高質(zhì)量編程規(guī)范》ppt課件_第4頁
《高質(zhì)量編程規(guī)范》ppt課件_第5頁
已閱讀5頁,還剩56頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、上章回想上章回想哈希函數(shù)的構(gòu)造方法有那些哈希表中處置沖突的方法有那些高質(zhì)量編程規(guī)范高質(zhì)量編程規(guī)范第八章第八章預(yù)習(xí)檢查預(yù)習(xí)檢查C言語要閱歷哪幾個編譯過程如何懇求鏈表單元,及釋放鏈表單元實(shí)現(xiàn)單鏈表插入的根本語法簡述一下快速排序根本實(shí)際要點(diǎn)課程目的課程目的本章概述論述如何進(jìn)展高質(zhì)量的編程,以及本卷須知本章目的了解高質(zhì)量編程留意的方方面面從代碼風(fēng)格,算法,方便調(diào)試,性能等。重點(diǎn)內(nèi)存分配與釋放,懸掛指針本章構(gòu)造本章構(gòu)造程序員的態(tài)度程序員的態(tài)度高質(zhì)量編程規(guī)范高質(zhì)量編程規(guī)范微觀上高質(zhì)量微觀上高質(zhì)量宏觀上高質(zhì)量宏觀上高質(zhì)量8.1 程序員的態(tài)度程序員的態(tài)度程序員的弱點(diǎn)不太情愿測試本人的代碼 不情愿REVIEW團(tuán)

2、隊隊員的代碼程序員重點(diǎn)保證本人的代碼沒有 BUG 來 8.1 程序員的態(tài)度程序員的態(tài)度程序員本身可以在程序生成的流程 詳細(xì)設(shè)計 編寫代碼單元測試 功能測試 代碼 REVIEW 8.1.1 編碼的風(fēng)格編碼的風(fēng)格版權(quán)和版本的聲明頭文件的構(gòu)造定義文件的構(gòu)造頭文件的作用目錄構(gòu)造命名規(guī)那么注釋規(guī)那么/* Copyright (c) 2001,上海貝爾網(wǎng)絡(luò)運(yùn)用事業(yè)部上海貝爾網(wǎng)絡(luò)運(yùn)用事業(yè)部* All rights reserved.* * 文件稱號:文件稱號:filename.h* 文件標(biāo)識:見配置管理方案書文件標(biāo)識:見配置管理方案書* 摘摘 要:簡要描畫本文件的內(nèi)容要:簡要描畫本文件的內(nèi)容* * 當(dāng)前版本

3、:當(dāng)前版本:1.1* 作作 者:輸入作者或修正者名字者:輸入作者或修正者名字* 完成日期:完成日期:2001年年7月月20日日* 取代版本:取代版本:1.0 * 原作者原作者 :輸入原作者或修正者名字:輸入原作者或修正者名字* 完成日期:完成日期:2001年年5月月10日日8.1.1.1 版權(quán)和版本的聲明版權(quán)和版本的聲明版權(quán)和版本的聲明位于頭文件和定義文件的開頭,主要內(nèi)容有:1版權(quán)信息。2文件稱號,標(biāo)識符,摘要。3當(dāng)前版本號,作者/修正者,完成日期。4版本歷史信息。范例8.1.1.2頭文件的構(gòu)造頭文件的構(gòu)造頭文件由三部分內(nèi)容組成:頭文件開頭處的版權(quán)和版本聲明。預(yù)處置塊。函數(shù)和類構(gòu)造聲明等。范例

4、為了防止頭文件被反復(fù)援用,該當(dāng)用ifndef/define/endif構(gòu)造產(chǎn)生預(yù)處置塊。用 #include 格式來援用規(guī)范庫的頭文件編譯器將從規(guī)范庫目錄開場搜索。用 #include “filename.h 格式來援用非規(guī)范庫的頭文件編譯器將從用戶的任務(wù)目錄開場搜索。頭文件中只存放“聲明而不存放“定義不提倡運(yùn)用全局變量,盡量不要在頭文件中出景象extern int value 這類聲明。8.1.1.3定義文件的構(gòu)造定義文件的構(gòu)造定義文件有三部分內(nèi)容:定義文件開頭處的版權(quán)和版本聲明對一些頭文件的援用程序的實(shí)現(xiàn)體包括數(shù)據(jù)和代碼范例/ 版權(quán)和版本聲明版權(quán)和版本聲明#include “graphic

5、s.h / 援用頭文件援用頭文件/ 全局函數(shù)的實(shí)現(xiàn)體全局函數(shù)的實(shí)現(xiàn)體void Function1()8.1.1.4 頭文件的作用頭文件的作用經(jīng)過頭文件來調(diào)用庫功能頭文件能加強(qiáng)類型平安檢查8.1.1.5 目錄構(gòu)造目錄構(gòu)造特點(diǎn):便于維護(hù)通常應(yīng)將頭文件和定義文件分別保管于不同的目錄加強(qiáng)信息隱藏:假設(shè)某些頭文件是私有的,它不會被用戶的程序直接援用,那么沒有必要公開其“聲明范例: Network 工程建立三個目錄 source:存放工程源文件,如:server.c Client.c Include:存放工程頭文件,如:server.h Client.h Lib:存放工程庫文件,如:tipr.so std

6、io.so8.1.1.6 命名規(guī)那么命名規(guī)那么主要思想:在變量和函數(shù)名中參與前綴以增進(jìn)人們對程序的了解詳細(xì)規(guī)那么:標(biāo)識符該當(dāng)直觀且可以拼讀,可望文知意,不用進(jìn)展“解碼。標(biāo)識符的長度該當(dāng)符合“min-length & max-information原那么命名規(guī)那么盡量與所采用的操作系統(tǒng)或開發(fā)工具的風(fēng)格堅持一致程序中不要出現(xiàn)僅靠大小寫區(qū)分的類似的標(biāo)識符程序中不要出現(xiàn)標(biāo)識符完全一樣的部分變量和全局變量變量的名字該當(dāng)運(yùn)用“名詞或者“描畫詞名詞用正確的反義詞組命名具有互斥意義的變量或相反動作的函數(shù)等8.1.2 程序的版式程序的版式空行代碼行代碼行內(nèi)的空格代碼對齊長行拆分修飾符的位置注釋8.1.2

7、.1 空行空行空行起著分隔程序段落的作用。空行得體不過多也不過少將使程序的規(guī)劃更加明晰??招胁粫速M(fèi)內(nèi)存空行規(guī)那么每個函數(shù)定義終了之后都要加空行在一個函數(shù)體內(nèi),邏揖上親密相關(guān)的語句之間不加空行,其它地方應(yīng)加空行分隔。8.1.2.2 代碼行規(guī)那么代碼行規(guī)那么一行代碼只做一件事情如只定義一個變量,或只寫一條語句。這樣的代碼容易閱讀,并且方便于寫注釋。if、for、while、do等語句自占一行,執(zhí)行語句不得緊跟其后。不論執(zhí)行語句有多少都要加。盡能夠在定義變量的同時初始化該變量就近原那么8.1.2.3 代碼行內(nèi)的空格代碼行內(nèi)的空格 關(guān)鍵字之后要留空格函數(shù)名之后不要留空格,緊跟左括號,以與關(guān)鍵字區(qū)別向

8、后緊跟,、,、;向前緊跟,緊跟處不留空格,之后要留空格二元操作符的前后該當(dāng)加空格。一元操作符前后不加空格。象“、“.、“-這類操作符前后不加空格。8.1.2.4 對齊和拆分規(guī)那么對齊和拆分規(guī)那么對齊規(guī)那么程序的分界符和應(yīng)獨(dú)占一行并且位于同一列,同時與援用它們的語句左對齊 之內(nèi)的代碼塊在右邊數(shù)格處左對齊。長行拆分規(guī)那么代碼行最大長度宜控制在70至80個字符以內(nèi)長表達(dá)式要在低優(yōu)先級操作符處拆分成新行,操作符放在新行之首以便突出操作符。拆分出的新行要進(jìn)展適當(dāng)?shù)目s進(jìn),使排版整齊,語句可讀8.1.2.5 長行拆分規(guī)那么長行拆分規(guī)那么 代碼行最大長度宜控制在70至80個字符以內(nèi) 長表達(dá)式要在低優(yōu)先級操作符

9、處拆分成新行,操作符放在新行之首以便突出操作符 例:if (very_longer_variable1 = very_longer_variable12)& (very_longer_variable3 = very_longer_variable14)& (very_longer_variable5 = b & c d & c + f = g + h ; 不要有多用途的復(fù)合表達(dá)式 d = (a = b + c) + r ; 不要把程序中的復(fù)合表達(dá)式與“真正的數(shù)學(xué)表達(dá)式混淆 if (a b c) 與 if (ab) & (b=或或“=-EPSINON)

10、& (x=EPSINON) 其中其中EPSINON是允許的誤差即精度。是允許的誤差即精度。 8.2.1.3 If語句語句指針變量與零值比較指針變量與零值比較 指針變量用指針變量用“=或或“!=與與NULL比較比較 例子:例子:與零值比較的規(guī)范與零值比較的規(guī)范if語句如下:語句如下:if (p = NULL)/ p與與NULL顯式比較,強(qiáng)調(diào)顯式比較,強(qiáng)調(diào)p是指針變量是指針變量if (p != NULL)不要寫成不要寫成if (p = 0) / 容易讓人誤解容易讓人誤解p是整型變量是整型變量if (p != 0) 或者或者 if (p)/ 容易讓人誤解容易讓人誤解p是布爾變量是布爾變量if

11、 (!p)8.2.1.4 運(yùn)用運(yùn)用const提高函數(shù)的強(qiáng)壯性提高函數(shù)的強(qiáng)壯性 const 用法:定義常量 修飾函數(shù)的參數(shù) 修飾函數(shù)的前往值 修飾函數(shù)的定義體 8.2.1.4.1 用用const修飾函數(shù)的參數(shù)修飾函數(shù)的參數(shù)const只能修飾輸入?yún)?shù) 特點(diǎn)假設(shè)輸入?yún)?shù)采用“指針傳送,那么加const修飾可以防止不測地改動該指針,起到維護(hù)作用 例:void StringCopy(char *strDestination, const char *strSource); 假設(shè)輸入?yún)?shù)采用“援用傳送 , 可以防止修正參數(shù)值的值傳送void Func(const A &a) 8.2.1.4.2 用

12、用const修飾函數(shù)的前往值修飾函數(shù)的前往值 假設(shè)給以“指針傳送方式的函數(shù)前往值加const修飾,那么函數(shù)前往值即指針內(nèi)容不能被修正例如函數(shù)const char * GetString(void);如下語句將出現(xiàn)編譯錯誤:char *str = GetString();正確的用法是const char *str = GetString();8.3.1 防止內(nèi)存走漏防止內(nèi)存走漏 內(nèi)存分配方式 malloc/free 的運(yùn)用要點(diǎn) 常見的內(nèi)存錯誤及其對策 援用與指針的比較 指針與數(shù)組的對比 指針參數(shù)是如何傳送內(nèi)存的動態(tài)內(nèi)存自動釋放 杜絕“野指針 8.3.1.1內(nèi)存分配方式內(nèi)存分配方式 內(nèi)存分配方式有

13、三種:從靜態(tài)存儲區(qū)域分配 在棧上創(chuàng)建 從堆上分配,亦稱動態(tài)內(nèi)存分配 malloc或new free或delete 8.3.1.2 malloc/free 的運(yùn)用要點(diǎn)的運(yùn)用要點(diǎn) malloc語法:void * malloc(size_t size); 作用:懇求一塊長度為length的整數(shù)類型的內(nèi)存 例子:int *p = (int *) malloc(sizeof(int) * length) Free語法:void free( void * memblock ) 作用:釋放內(nèi)存 例子:freep假設(shè)p是NULL指針,那么free對p無論操作多少次都不會出問題假設(shè)p不是NULL指針,那么fre

14、e對p延續(xù)操作兩次就會導(dǎo)致程序運(yùn)轉(zhuǎn)錯誤。8.3.1.3 常見的內(nèi)存錯誤及其對策常見的內(nèi)存錯誤及其對策 常見的內(nèi)存錯誤 內(nèi)存分配未勝利,卻運(yùn)用了它 內(nèi)存分配雖然勝利,但是尚未初始化就援用它 內(nèi)存分配勝利并且曾經(jīng)初始化,但操作越過了內(nèi)存的邊境 忘記了釋放內(nèi)存,呵斥內(nèi)存泄露 釋放了內(nèi)存卻繼續(xù)運(yùn)用它 8.3.1.3 常見的內(nèi)存錯誤及其對策常見的內(nèi)存錯誤及其對策 內(nèi)存管理的規(guī)那么 用malloc之后,應(yīng)該立刻檢查指針值能否為NULL。防止運(yùn)用指針值為NULL的內(nèi)存。不要忘記為數(shù)組和動態(tài)內(nèi)存賦初值。防止將未被初始化的內(nèi)存作為右值運(yùn)用。防止數(shù)組或指針的下標(biāo)越界,特別要留意發(fā)生“多1或者“少1操作。動態(tài)內(nèi)存的

15、懇求與釋放必需配對,防止內(nèi)存走漏。用free釋放了內(nèi)存之后,立刻將指針設(shè)置為NULL,防止產(chǎn)生“野指針。8.3.1.5 指針與數(shù)組的對比指針與數(shù)組的對比 差別數(shù)組:要么在靜態(tài)存儲區(qū)被創(chuàng)建如全局?jǐn)?shù)組,要么在棧上被創(chuàng)建 數(shù)組名對應(yīng)著而不是指向一塊內(nèi)存其地址與容量在生命期內(nèi)堅持不變只需數(shù)組的內(nèi)容可以改動 指針:隨時指向恣意類型的內(nèi)存塊 動態(tài)生存在數(shù)據(jù)堆8.3.1.5 指針與數(shù)組的對比指針與數(shù)組的對比 差別內(nèi)存的容量大小例:1例2char a = hello world; char *p = a; sizeof(a) ?/ 12字節(jié)字節(jié) sizeof(p) ?/ 4字節(jié)字節(jié) void Func(cha

16、r a100) sizeof(a) ? / 4字節(jié)而不是字節(jié)而不是100字節(jié)字節(jié) 8.3.1.5 指針與數(shù)組的對比指針與數(shù)組的對比 動態(tài)內(nèi)存會自動釋放 不會自動釋放例:指針應(yīng)該留意的特性指針消亡了,并不表示它所指的內(nèi)存會被自動釋放。內(nèi)存被釋放了,并不表示指針會消亡或者成了NULL指針。void Func(void) char *p = (char *) malloc(100); / 動態(tài)內(nèi)存會自動釋放嗎?動態(tài)內(nèi)存會自動釋放嗎? 8.3.1.6 指針參數(shù)是如何傳送內(nèi)存的指針參數(shù)是如何傳送內(nèi)存的*假設(shè)函數(shù)的參數(shù)是一個指針,不要指望用該指針去懇求動態(tài)內(nèi)存假設(shè)函數(shù)的參數(shù)是一個指針,不要指望用該指針去懇

17、求動態(tài)內(nèi)存 void GetMemory(char *p, int num) p = (char *)malloc(sizeof(char) * num); void Test(void) char *str = NULL; GetMemory(str, 100); / str 依然為依然為 NULL strcpy(str, hello);/ 運(yùn)轉(zhuǎn)錯誤運(yùn)轉(zhuǎn)錯誤 8.3.1.6 指針參數(shù)是如何傳送內(nèi)存的指針參數(shù)是如何傳送內(nèi)存的*假設(shè)函數(shù)的參數(shù)是一個指針,不要指望用該指針去懇求動態(tài)內(nèi)存假設(shè)函數(shù)的參數(shù)是一個指針,不要指望用該指針去懇求動態(tài)內(nèi)存 void GetMemory2(char *p, int

18、 num) *p = (char *)malloc(sizeof(char) * num); void Test(void) char *str = NULL; GetMemory(&str, 100); / str 依然為依然為 NULL strcpy(str, hello);/ 運(yùn)轉(zhuǎn)錯誤運(yùn)轉(zhuǎn)錯誤 8.3.1.6 指針參數(shù)是如何傳送內(nèi)存的指針參數(shù)是如何傳送內(nèi)存的* * * * 不要用不要用returnreturn語句前往指向語句前往指向“棧內(nèi)存的指針棧內(nèi)存的指針 char *GetString(void) char p = hello world; return p; / 編譯器將提

19、出警告編譯器將提出警告 void Test4(void) char *str = NULL; str = GetString(); / str 的內(nèi)容是渣滓的內(nèi)容是渣滓 printf(“%sn,str ); 8.3.1.7動態(tài)內(nèi)存自動釋放動態(tài)內(nèi)存自動釋放 free函數(shù)特點(diǎn)釋放指針?biāo)傅膬?nèi)存沒有銷毀指針,故指針地址依然不變非NULL例: char *p = (char *) malloc(100);strcpy(p, “hello);free(p); / p 所指的內(nèi)存被釋放,但是所指的內(nèi)存被釋放,但是p所指的地址依然不變所指的地址依然不變if(p != NULL) strcpy(p, “wor

20、ld);/ 出錯出錯 沒有起到?jīng)]有起到防錯作用防錯作用8.3.1.8 杜絕杜絕“野指針野指針 什么是“野指針不是NULL指針是指向“渣滓內(nèi)存的指針 If(p!=NULL)不能起到作用野指針的成因指針變量沒有被初始化 指針初始化:char *p = NULL;char *str = (char *) malloc(100);指針p被free或者delete之后,沒有置為NULL 8.3.2 編程的優(yōu)化編程的優(yōu)化為什么需求常量Const與#define的比較常量定義規(guī)那么循環(huán)語句的效率For語句的循環(huán)控制變量8.3.2.1 為什么用常量為什么用常量常量是一種標(biāo)識符,它的值在運(yùn)轉(zhuǎn)期間恒定不變。用 #

21、define來定義常量稱為宏常量,還可以用const來定義常量為什么要常量程序的可讀性在程序的很多地方輸入同樣的數(shù)字或字符串,難保不發(fā)生書寫錯誤。假設(shè)要修正數(shù)字或字符串,那么會在很多地方改動,既費(fèi)事又容易出錯。盡量運(yùn)用含義直觀的常量來表示那些將在程序中多次出現(xiàn)的數(shù)字或字符串。例如:#define MAX 100/* C言語的宏常量 */ const int MAX = 100;/ C 言語的const常量const float PI = 3.14159;/ C 言語的const常量8.3.2.2 const 與與 #define的比較的比較兩種區(qū)別比較const常量有數(shù)據(jù)類型,而宏常量沒有數(shù)據(jù)

22、類型。編譯器可以對前者進(jìn)展類型平安檢查。而對后者只進(jìn)展字符交換,沒有類型平安檢查有些集成化的調(diào)試工具可以對const常量進(jìn)展調(diào)試,但是不能對宏常量進(jìn)展調(diào)試。常量定義規(guī)那么需求對外公開的常量放在頭文件中,不需求對外公開的常量放在定義文件的頭部為便于管理,可以把不同模塊的常量集中存放在一個公共的頭文件中。假設(shè)某一常量與其它常量親密相關(guān),應(yīng)在定義中包含這種關(guān)系,而不應(yīng)給出一些孤立的值。例如:const float RADIUS = 100;const float DIAMETER = RADIUS * 2;8.3.2.3循環(huán)語句的效率循環(huán)語句的效率在多重循環(huán)中,假設(shè)有能夠,該當(dāng)將最長的循環(huán)放在最內(nèi)層

23、,最短的循環(huán)放在最外層,以減少CPU跨切循環(huán)層的次數(shù)。假設(shè)循環(huán)體內(nèi)存在邏輯判別,并且循環(huán)次數(shù)很大,宜將邏輯判別移到循環(huán)體的外面。for (row=0; row100; row+)for ( col=0; col5; col+ )sum = sum + arowcol;if (condition) for (i=0; iN; i+) DoSomething();else for (i=0; iN; i+) DoOtherthing();8.3.2.4 for語句的循環(huán)控制變量語句的循環(huán)控制變量循環(huán)控制變量規(guī)那么不可在for 循環(huán)體內(nèi)修正循環(huán)變量,防止for 循環(huán)失去控制 建議for語句的循環(huán)控制

24、變量的取值采用“半開半閉區(qū)間寫法 例子:半開半閉區(qū)間 閉區(qū)間 for (x=0; xN; x+) for (x=0; x=N; x+) ;8.3.2.5 Pragma預(yù)處置預(yù)處置其格式普通為: #Pragma Para 其中Para 為參數(shù),下面來看一些常用的參數(shù)。 #pragma message編譯信息輸出窗口中輸出相應(yīng)的信息,這對于源代碼信息的控制是非常重要的。其運(yùn)用方法為:#Pragma message(“音訊文本) #pragma once只需在頭文件的最開場參與這條指令就可以保證頭文件被編譯一次,這條指令實(shí)踐上在VC6中就曾經(jīng)有了,但是思索到兼容性并沒有太多的運(yùn)用它。pragma comment(.) 該指令將一個注釋記錄放入一個對象文件或可執(zhí)行文件中。 常用的lib關(guān)鍵字,可以幫我們連入一個庫文件。8.3.2.5 Pragma預(yù)處置預(yù)處置#pragma pack() 對于想構(gòu)造體對于想構(gòu)造體Struct這樣的類型,這樣的類型,VC采用采用8字節(jié)對齊的方字節(jié)對齊的方式,假設(shè)我們不想運(yùn)用式,假設(shè)我們不想運(yùn)用8字節(jié)對齊在網(wǎng)絡(luò)變成中

溫馨提示

  • 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

提交評論