|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
程序匠人兄的《編程修養(yǎng)》不明白的地方,請(qǐng)執(zhí)教! |
| 作者:guorock 欄目:單片機(jī) |
4、函數(shù)的[in][out]參數(shù) 我經(jīng)?吹竭@樣的程序: FuncName(CHAR* str) { int len = strlen(str); ..... } CHAR* GetUserName(struct user* pUser) { return pUser->NAME; } 不!請(qǐng)不要這樣做。 你應(yīng)該先判斷一下傳進(jìn)來的那個(gè)指針是不是為空。如果傳進(jìn)來的指針為空的話,那么,你的一個(gè)大的系統(tǒng)就會(huì)因?yàn)檫@一個(gè)小的函數(shù)而崩潰。一種更好的技術(shù)是使用斷言(assert),這里我就不多說這些技術(shù)細(xì)節(jié)了。當(dāng)然,如果是在C++中,引用要比指針好得多,但你也需要對(duì)各個(gè)參數(shù)進(jìn)行檢查。 寫有參數(shù)的函數(shù)時(shí),首要工作,就是要對(duì)傳進(jìn)來的所有參數(shù)進(jìn)行合法性檢查。而對(duì)于傳出的參數(shù)也應(yīng)該進(jìn)行檢查,這個(gè)動(dòng)作當(dāng)然應(yīng)該在函數(shù)的外部,也就是說,調(diào)用完一個(gè)函數(shù)后,應(yīng)該對(duì)其傳出的值進(jìn)行檢查。 請(qǐng)問:如何判斷指針是否為空?如何對(duì)傳進(jìn)來的所有參數(shù)進(jìn)行合法性檢查?如何對(duì)于傳出的參數(shù)也應(yīng)該進(jìn)行檢查?能各舉各例子當(dāng)然最好了 ,呵呵! |
| 2樓: | >>參與討論 |
| 作者: guorock 于 2005/12/17 10:14:00 發(fā)布:
判斷指針是否為空,是不是這樣? FuncName(CHAR* str) { if ( str != NULL ) { int len = strlen(str); ..... } } CHAR* GetUserName(struct user* pUser) { if ( pUser != NULL ) { return pUser->NAME; } } |
|
| 3樓: | >>參與討論 |
| 作者: 程序匠人 于 2005/12/17 22:57:00 發(fā)布:
《編程修養(yǎng)》不是匠人寫的 這個(gè)問題匠人沒有研究過,因?yàn)榻橙似綍r(shí)比較多的是在用匯編.請(qǐng)哪位C高手來解一下吧 |
|
| 4樓: | >>參與討論 |
| 作者: guorock 于 2005/12/17 23:29:00 發(fā)布:
呵呵,期待高手的出現(xiàn),以前真沒注意這個(gè)問題 |
|
| 5樓: | >>參與討論 |
| 作者: hotpower 于 2005/12/18 0:24:00 發(fā)布:
肯定要判空 |
|
| 6樓: | >>參與討論 |
| 作者: guorock 于 2005/12/18 9:15:00 發(fā)布:
樓上:可否說得詳細(xì)些呢,呵呵 |
|
| 7樓: | >>參與討論 |
| 作者: 后學(xué) 于 2005/12/18 11:44:00 發(fā)布:
哈哈,不判斷指針有效性等于自殺 |
|
| 8樓: | >>參與討論 |
| 作者: 農(nóng)民講習(xí)所 于 2005/12/18 11:49:00 發(fā)布:
函數(shù)內(nèi)部不判空,空指針判斷是外部調(diào)用的責(zé)任。 而且這些函數(shù)即使是空指針也是無害的。 這是作用域問題,低層函數(shù)不負(fù)責(zé)這些,這樣效率才能提高,同時(shí)安全能保證。 |
|
| 9樓: | >>參與討論 |
| 作者: 農(nóng)民講習(xí)所 于 2005/12/18 11:53:00 發(fā)布:
而且低層函數(shù)被封裝后是不知道如何處理錯(cuò)誤的 只有要高的處理層次上才知道,這是程序結(jié)構(gòu)要求注定的。 |
|
| 10樓: | >>參與討論 |
| 作者: and 于 2005/12/18 12:35:00 發(fā)布:
空指針的兩種處理方法 根據(jù)使用情況的不同: 1、用斷言。如果傳進(jìn)來的指針 不應(yīng)該 是空的,即該函數(shù) 沒有義務(wù)處理空指針,而由于調(diào)用者在開發(fā)中的失誤造成傳進(jìn)的指針為空,這種情況用assert。 2、用if語句。如果傳進(jìn)來的指針 可以 是空的,即該函數(shù)內(nèi)部要處理空指針的情況,則應(yīng)該用相應(yīng)的語句來處理空指針,因?yàn)檫@是 該函數(shù) 功能定義 的一部分。 |
|
| 11樓: | >>參與討論 |
| 作者: yanfengzhu 于 2005/12/18 16:41:00 發(fā)布:
用斷言比較好吧 例如: #include <assert.h> CHAR* GetUserName(struct user* pUser) { assert(pUser != NULL); return pUser->NAME; } |
|
| 12樓: | >>參與討論 |
| 作者: 艾森豪威爾 于 2005/12/19 10:30:00 發(fā)布:
摟主答對(duì)一半 對(duì)于傳入?yún)?shù),在函數(shù)內(nèi)部判斷; 對(duì)于傳出的參數(shù)也應(yīng)該進(jìn)行檢查,這個(gè)動(dòng)作當(dāng)然應(yīng)該在函數(shù)的外部,也就是說,調(diào)用完一個(gè)函數(shù)后,應(yīng)該對(duì)其傳出的值進(jìn)行檢查。 而你是在函數(shù)內(nèi)判斷的。 這個(gè)人家原文說得很清楚了你還在函數(shù)內(nèi)判斷。 |
|
| 13樓: | >>參與討論 |
| 作者: 農(nóng)民講習(xí)所 于 2005/12/19 10:38:00 發(fā)布:
assert()只是一個(gè)調(diào)試工具 錯(cuò)誤陷阱。在MCU設(shè)計(jì)中很難用到,因?yàn)殄e(cuò)誤信息很難有輸出。大家要擦亮眼睛,別跟風(fēng)。 |
|
| 14樓: | >>參與討論 |
| 作者: 農(nóng)民講習(xí)所 于 2005/12/19 11:01:00 發(fā)布:
舉個(gè)例子說明 malloc()大家都知道,動(dòng)態(tài)分配內(nèi)存。在該函數(shù)內(nèi)部是不判斷有無分配成功的,即不判斷返回指針為空。但我們?cè)谕獠空{(diào)用該函數(shù)時(shí)都會(huì)有判斷: p = malloc(100); if( p )...之類。所以說,要低層函數(shù)內(nèi)部是不需要判斷的。 這種例子還可以從很多C函數(shù)中找到。 這種層次,就是我們需要的控制面。和喂狗一樣,不要想喂就喂,要找著地方喂,只喂必要的,不喂多余的。 |
|
| 15樓: | >>參與討論 |
| 作者: gbchang 于 2005/12/19 11:06:00 發(fā)布:
同意所長(zhǎng)說的:“低層函數(shù)不負(fù)責(zé)這些,這樣效率才能提高” 調(diào)用者多數(shù)情況是可以保證正確的。 由其在MCU編程中。 |
|
|
|
| 免費(fèi)注冊(cè)為維庫電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |