音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費(fèi)注冊(cè) 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場(chǎng)網(wǎng)
技術(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ī)
程序匠人兄的《編程修養(yǎng)》不明白的地方,請(qǐng)執(zhí)教!
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
判斷指針是否為空,是不是這樣?
FuncName(CHAR* str)
{
  if ( str != NULL )
    {
         int len = strlen(str);
       .....
     }
}
CHAR*
GetUserName(struct user* pUser)
{
  if ( pUser != NULL )
    {
         return pUser->NAME;
     }
}





3樓: >>參與討論
程序匠人
《編程修養(yǎng)》不是匠人寫的
這個(gè)問題匠人沒有研究過,因?yàn)榻橙似綍r(shí)比較多的是在用匯編.請(qǐng)哪位C高手來解一下吧

4樓: >>參與討論
guorock
呵呵,期待高手的出現(xiàn),以前真沒注意這個(gè)問題
 
5樓: >>參與討論
hotpower
肯定要判空
 
6樓: >>參與討論
guorock
樓上:可否說得詳細(xì)些呢,呵呵
 
7樓: >>參與討論
后學(xué)
哈哈,不判斷指針有效性等于自殺
 
8樓: >>參與討論
農(nóng)民講習(xí)所
函數(shù)內(nèi)部不判空,空指針判斷是外部調(diào)用的責(zé)任。
而且這些函數(shù)即使是空指針也是無害的。

這是作用域問題,低層函數(shù)不負(fù)責(zé)這些,這樣效率才能提高,同時(shí)安全能保證。

9樓: >>參與討論
農(nóng)民講習(xí)所
而且低層函數(shù)被封裝后是不知道如何處理錯(cuò)誤的
只有要高的處理層次上才知道,這是程序結(jié)構(gòu)要求注定的。

10樓: >>參與討論
and
空指針的兩種處理方法
根據(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
用斷言比較好吧
例如:
#include <assert.h>
CHAR*
GetUserName(struct user* pUser)
{
  assert(pUser != NULL);
    return pUser->NAME;
}


12樓: >>參與討論
艾森豪威爾
摟主答對(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í)所
assert()只是一個(gè)調(diào)試工具
錯(cuò)誤陷阱。在MCU設(shè)計(jì)中很難用到,因?yàn)殄e(cuò)誤信息很難有輸出。大家要擦亮眼睛,別跟風(fēng)。

14樓: >>參與討論
農(nóng)民講習(xí)所
舉個(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
同意所長(zhǎng)說的:“低層函數(shù)不負(fù)責(zé)這些,這樣效率才能提高”
調(diào)用者多數(shù)情況是可以保證正確的。
由其在MCU編程中。


參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
誰幫我啊
在產(chǎn)品中加入一個(gè)時(shí)鐘模塊,用什么芯片?
請(qǐng)教串口通訊問題
我想用單片機(jī)一只引腳來控制關(guān)斷自己的電源
請(qǐng)問:數(shù)據(jù)存儲(chǔ)器在片選選通時(shí)是不是高阻態(tài)?
免費(fèi)注冊(cè)為維庫電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào)