C語言編程學(xué)習(xí):出錯(cuò)信息的處理

C語言是面向過程的叹俏,而C++是面向?qū)ο蟮?/p>

C和C++的區(qū)別:

C是一個(gè)結(jié)構(gòu)化語言,它的重點(diǎn)在于算法和數(shù)據(jù)結(jié)構(gòu)僻族。C程序的設(shè)計(jì)首要考慮的是如何通過一個(gè)過程粘驰,對(duì)輸入(或環(huán)境條件)進(jìn)行運(yùn)算處理得到輸出(或?qū)崿F(xiàn)過程(事務(wù))控制)。

C++述么,首要考慮的是如何構(gòu)造一個(gè)對(duì)象模型蝌数,讓這個(gè)模型能夠契合與之對(duì)應(yīng)的問題域,這樣就可以通過獲取對(duì)象的狀態(tài)信息得到輸出或?qū)崿F(xiàn)過程(事務(wù))控制度秘。 所以C與C++的最大區(qū)別在于它們的用于解決問題的思想方法不一樣顶伞。之所以說C++比C更先進(jìn),是因?yàn)椤?設(shè)計(jì)這個(gè)概念已經(jīng)被融入到C++之中 ”剑梳。

C與C++的最大區(qū)別:在于它們的用于解決問題的思想方法不一樣唆貌。之所以說C++比C更先進(jìn),是因?yàn)椤?設(shè)計(jì)這個(gè)概念已經(jīng)被融入到C++之中 ”垢乙,而就語言本身而言锨咙,在C中更多的是算法的概念。那么是不是C就不重要了追逮,錯(cuò)酪刀!算法是程序設(shè)計(jì)的基礎(chǔ),好的設(shè)計(jì)如果沒有好的算法钮孵,一樣不行骂倘。而且,“C加上好的設(shè)計(jì)”也能寫出非常好的東西巴席。

}小編推薦一個(gè)學(xué)C語言/C++的學(xué)習(xí)裙【 六九九稠茂,四七零,五九六 】,無論你是大牛還是小白睬关,是想轉(zhuǎn)行還是想入行都可以來了解一起進(jìn)步一起學(xué)習(xí)诱担!裙內(nèi)有開發(fā)工具,很多干貨和技術(shù)資料分享电爹!

11蔫仙、出錯(cuò)信息的處理

—————————

你會(huì)處理出錯(cuò)信息嗎?哦丐箩,它并不是簡單的輸出摇邦。看下面的示例:

if ( p == NULL ){

printf ( "ERR: The pointer is NULL " );

}

告別學(xué)生時(shí)代的編程吧屎勘。這種編程很不利于維護(hù)和管理施籍,出錯(cuò)信息或是提示信息,應(yīng)該統(tǒng)

一處理概漱,而不是像上面這樣丑慎,寫成一個(gè)“硬編碼”。第10條對(duì)這方面的處理做了一部分說

明瓤摧。如果要管理錯(cuò)誤信息竿裂,那就要有以下的處理:

/* 聲明出錯(cuò)代碼 */

#define ERR_NO_ERROR 0 /* No error */

#define ERR_OPEN_FILE 1 /* Open file error */

#define ERR_SEND_MESG 2 /* sending a message error */

#define ERR_BAD_ARGS 3 /* Bad arguments */

#define ERR_MEM_NONE 4 /* Memeroy is not enough */

#define ERR_SERV_DOWN 5 /* Service down try later */

#define ERR_UNKNOW_INFO 6 /* Unknow information */

#define ERR_SOCKET_ERR 7 /* Socket operation failed */

#define ERR_PERMISSION 8 /* Permission denied */

#define ERR_BAD_FORMAT 9 /* Bad configuration file */

#define ERR_TIME_OUT 10 /* Communication time out */

/* 聲明出錯(cuò)信息 */

char* errmsg[] = {

/* 0 */ "No error",

/* 1 */ "Open file error",

/* 2 */ "Failed in sending/receiving a message",

/* 3 */ "Bad arguments",

/* 4 */ "Memeroy is not enough",

/* 5 */ "Service is down; try later",

/* 6 */ "Unknow information",

/* 7 */ "A socket operation has failed",

/* 8 */ "Permission denied",

/* 9 */ "Bad configuration file format",

/* 10 */ "Communication time out",

/* 10 */ "Communication time out",

};

/* 聲明錯(cuò)誤代碼全局變量 */

long errno = 0;

/* 打印出錯(cuò)信息函數(shù) */

void perror( char* info)

{

if ( info ){

printf("%s: %s ", info, errmsg[errno] );

return;

}

printf("Error: %s ", errmsg[errno] );

}

這個(gè)基本上是ANSI的錯(cuò)誤處理實(shí)現(xiàn)細(xì)節(jié)了,于是當(dāng)你程序中有錯(cuò)誤時(shí)你就可以這樣處理:

bool CheckPermission( char* userName )

{

if ( strcpy(userName, "root") != 0 ){

errno = ERR_PERMISSION_DENIED;

return (FALSE);

}

...

}

main()

{

...

if (! CheckPermission( username ) ){

perror("main()");

}

...

}

一個(gè)即有共性照弥,也有個(gè)性的錯(cuò)誤信息處理腻异,這樣做有利同種錯(cuò)誤出一樣的信息,統(tǒng)一用戶

界面这揣,而不會(huì)因?yàn)槲募蜷_失敗悔常,A程序員出一個(gè)信息,B程序員又出一個(gè)信息给赞。而且這樣

做这嚣,非常容易維護(hù)。代碼也易讀塞俱。

當(dāng)然姐帚,物極必反,也沒有必要把所有的輸出都放到errmsg中障涯,抽取比較重要的出錯(cuò)信息或

是提示信息是其關(guān)鍵罐旗,但即使這樣,這也包括了大多數(shù)的信息唯蝶。

12九秀、常用函數(shù)和循環(huán)語句中的被計(jì)算量

—————————————————

看一下下面這個(gè)例子:

for( i=0; i<1000; i++ ){

GetLocalHostName( hostname );

...


}小編推薦一個(gè)學(xué)C語言/C++的學(xué)習(xí)裙【 六九九,四七零粘我,五九六 】鼓蜒,無論你是大牛還是小白痹换,是想轉(zhuǎn)行還是想入行都可以來了解一起進(jìn)步一起學(xué)習(xí)!裙內(nèi)有開發(fā)工具都弹,很多干貨和技術(shù)資料分享娇豫!

GetLocalHostName的意思是取得當(dāng)前計(jì)算機(jī)名,在循環(huán)體中畅厢,它會(huì)被調(diào)用1000次啊冯痢。這是

多么的沒有效率的事啊。應(yīng)該把這個(gè)函數(shù)拿到循環(huán)體外框杜,這樣只調(diào)用一次浦楣,效率得到了很

大的提高。雖然咪辱,我們的編譯器會(huì)進(jìn)行優(yōu)化振劳,會(huì)把循環(huán)體內(nèi)的不變的東西拿到循環(huán)外面,

但是油狂,你相信所有編譯器會(huì)知道哪些是不變的嗎历恐?我覺得編譯器不可靠。最好還是自己動(dòng)

手吧选调。

同樣夹供,對(duì)于常用函數(shù)中的不變量灵份,如:

GetLocalHostName(char* name)

{

char funcName[] = "GetLocalHostName";

sys_log( "%s begin......", funcName );

...

sys_log( "%s end......", funcName );

}

如果這是一個(gè)經(jīng)常調(diào)用的函數(shù)仁堪,每次調(diào)用時(shí)都要對(duì)funcName進(jìn)行分配內(nèi)存,這個(gè)開銷很大

啊填渠。把這個(gè)變量聲明成static吧弦聂,當(dāng)函數(shù)再次被調(diào)用時(shí),就會(huì)省去了分配內(nèi)存的開銷氛什,執(zhí)

行效率也很好莺葫。

13、函數(shù)名和變量名的命名

————————————

我看到許多程序?qū)ψ兞棵秃瘮?shù)名的取名很草率枪眉,特別是變量名捺檬,什么a,b,c,aa,bb,cc,

還有什么flag1,flag2, cnt1, cnt2贸铜,這同樣是一種沒有“修養(yǎng)”的行為堡纬。即便加上好的注

釋。好的變量名或是函數(shù)名蒿秦,我認(rèn)為應(yīng)該有以下的規(guī)則:

1) 直觀并且可以拼讀烤镐,可望文知意,不必“解碼”棍鳖。

2) 名字的長度應(yīng)該即要最短的長度炮叶,也要能最大限度的表達(dá)其含義。

3) 不要全部大寫,也不要全部小寫镜悉,應(yīng)該大小寫都有祟辟,如:GetLocalHostName 或是

UserAccount。

4) 可以簡寫积瞒,但簡寫得要讓人明白川尖,如:ErrorCode -> ErrCode,

ServerListener -> ServLisner,UserAccount -> UsrAcct 等茫孔。

5) 為了避免全局函數(shù)和變量名字沖突叮喳,可以加上一些前綴,一般以模塊簡稱做為前綴

缰贝。

6) 全局變量統(tǒng)一加一個(gè)前綴或是后綴馍悟,讓人一看到這個(gè)變量就知道是全局的。

7) 用匈牙利命名法命名函數(shù)參數(shù)剩晴,局部變量锣咒。但還是要堅(jiān)持“望文生意”的原則。

8) 與標(biāo)準(zhǔn)庫(如:STL)或開發(fā)庫(如:MFC)的命名風(fēng)格保持一致赞弥。

14毅整、函數(shù)的傳值和傳指針

————————————

向函數(shù)傳參數(shù)時(shí),一般而言绽左,傳入非const的指針時(shí)悼嫉,就表示,在函數(shù)中要修改這個(gè)指針把

指內(nèi)存中的數(shù)據(jù)拼窥。如果是傳值戏蔑,那么無論在函數(shù)內(nèi)部怎么修改這個(gè)值,也影響不到傳過來

的值鲁纠,因?yàn)閭髦凳侵粌?nèi)存拷貝总棵。

什么?你說這個(gè)特性你明白了改含,好吧情龄,讓我們看看下面的這個(gè)例程:

void

void

GetVersion(char* pStr)

{

pStr = malloc(10);

strcpy ( pStr, "2.0" );

}

main()

{

char* ver = NULL;

GetVersion ( ver );

...

...

free ( ver );

}

我保證,類似這樣的問題是一個(gè)新手最容易犯的錯(cuò)誤捍壤。程序中妄圖通過函數(shù)GetVersion給

指針ver分配空間骤视,但這種方法根本沒有什么作用,原因就是——這是傳值白群,不是傳指針尚胞。

你或許會(huì)和我爭論,我分明傳的時(shí)指針爸穆笼裳?再仔細(xì)看看唯卖,其實(shí),你傳的是指針其實(shí)是在傳

值躬柬。

15拜轨、修改別人程序的修養(yǎng)

———————————

當(dāng)你維護(hù)別人的程序時(shí),請(qǐng)不要非常主觀臆斷的把已有的程序刪除或是修改允青。我經(jīng)抽夏耄看到

有的程序員直接在別人的程序上修改表達(dá)式或是語句。修改別人的程序時(shí)颠锉,請(qǐng)不要?jiǎng)h除別

人的程序法牲,如果你覺得別人的程序有所不妥,請(qǐng)注釋掉琼掠,然后添加自己的處理程序拒垃,必竟

,你不可能100%的知道別人的意圖瓷蛙,所以為了可以恢復(fù)悼瓮,請(qǐng)不依賴于CVS或是SourceSafe這

種版本控制軟件,還是要在源碼上給別人看到你修改程序的意圖和步驟艰猬。這是程序維護(hù)時(shí)

横堡,一個(gè)有修養(yǎng)的程序員所應(yīng)該做的。

如下所示冠桃,這就是一種比較好的修改方法:

/*

* ----- commented by haoel 2003/04/12 ------

*

* char* p = ( char* ) malloc( 10 );

* memset( p, 0, 10 );

*/

/* ------ Added by haoel 2003/04/12 ----- */

char* p = ( char* )calloc( 10, sizeof char );

/* ---------------------------------------- */

* char* p = 開始使勁) malloc( 10 );

* memset( p, 0, 10 );

*/

/* ------ Added by haoel 2003/04/12 ----- */

char* p = ( char* )calloc( 10, sizeof char );

/* ---------------------------------------- */

...

小編推薦一個(gè)學(xué)C語言/C++的學(xué)習(xí)裙【 六九九命贴,四七零,五九六 】腊满,無論你是大牛還是小白套么,是想轉(zhuǎn)行還是想入行都可以來了解一起進(jìn)步一起學(xué)習(xí)培己!裙內(nèi)有開發(fā)工具碳蛋,很多干貨和技術(shù)資料分享!

當(dāng)然省咨,這種方法是在軟件維護(hù)時(shí)使用的肃弟,這樣的方法,可以讓再維護(hù)的人很容易知道以前

的代碼更改的動(dòng)作和意圖零蓉,而且這也是對(duì)原作者的一種尊敬笤受。

以“注釋 — 添加”方式修改別人的程序,要好于直接刪除別人的程序

這些是C/C++能做的

服務(wù)器開發(fā)工程師敌蜂、人工智能箩兽、云計(jì)算工程師、信息安全(黑客反黑客)章喉、大數(shù)據(jù) 汗贫、數(shù)據(jù)平臺(tái)身坐、嵌入式工程師、流媒體服務(wù)器落包、數(shù)據(jù)控解部蛇、圖像處理、音頻視頻開發(fā)工程師咐蝇、游戲服務(wù)器涯鲁、分布式系統(tǒng)、游戲輔助等

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末有序,一起剝皮案震驚了整個(gè)濱河市抹腿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌旭寿,老刑警劉巖幢踏,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異许师,居然都是意外死亡房蝉,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門微渠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來搭幻,“玉大人,你說我怎么就攤上這事逞盆√刺#” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵云芦,是天一觀的道長俯逾。 經(jīng)常有香客問我,道長舅逸,這世上最難降的妖魔是什么桌肴? 我笑而不...
    開封第一講書人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮琉历,結(jié)果婚禮上坠七,老公的妹妹穿的比我還像新娘。我一直安慰自己旗笔,他們只是感情好彪置,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蝇恶,像睡著了一般拳魁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上撮弧,一...
    開封第一講書人閱讀 50,050評(píng)論 1 291
  • 那天潘懊,我揣著相機(jī)與錄音耀盗,去河邊找鬼。 笑死卦尊,一個(gè)胖子當(dāng)著我的面吹牛叛拷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播岂却,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼忿薇,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了躏哩?” 一聲冷哼從身側(cè)響起署浩,我...
    開封第一講書人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎扫尺,沒想到半個(gè)月后筋栋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡正驻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年弊攘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片姑曙。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡襟交,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出伤靠,到底是詐尸還是另有隱情捣域,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布宴合,位于F島的核電站焕梅,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏卦洽。R本人自食惡果不足惜贞言,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望逐样。 院中可真熱鬧蜗字,春花似錦打肝、人聲如沸脂新。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽争便。三九已至,卻和暖如春断医,著一層夾襖步出監(jiān)牢的瞬間滞乙,已是汗流浹背奏纪。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留斩启,地道東北人序调。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像兔簇,于是被迫代替她去往敵國和親发绢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容