花差花差

像写情书一样写代码

用户操作
[即时聊天] [发私信] [加为好友]
花差花差ID:fzd999
168682次访问,排名476(1),好友4人,关注者37人。
物格而后知致,知致而后身修~
fzd999的文章
原创 46 篇
翻译 0 篇
转载 0 篇
评论 771 篇
花差花差的公告

这里全部是我的原创,一点一滴积累下来的文字。
闲时,总喜欢把玩自己写的小玩艺,细细读网友的评论,然后再看一遍。
如果你是我的朋友,很开心你能来这里做客,如果你是匆匆过客,也希望小坐一会儿,留下几字评论。

最近评论
wangtianyou1981:与客户的沟通是必须的。如何去引导客户将其需求引导出来才是关键。对于团队的管理的确是要进行责任与权力的分配,当让最好的办法就是定制相应的奖惩与考核办法。
chxksh:管理岗位也有很多种.层级不同,对技术的要求也不同,混而论之,就很难一概而论了. 文中所说的管理者应该是比项目经理更高的层级.我赞同.
sap99:www.sap99.com/,SAP99资料多多

SAP免费资料下载
http://www.sap99.com

有很多的学习资料,推荐一下,
zhaowanru19:你来上海了。。。
我都不知道。。。
呵呵。。。
最近工作怎样?
忙不。。。

lyai007:要跟你做個朋友不知道可不可以
文章分类
收藏
    相册
    值得纪念的一切
    我的朋友们
    ee——左边风景
    团团的饭团
    大东——东大传说
    大雨仔
    我们的婉如同学
    我心如水
    流风轩主——颜鹏
    默默——心绪缥缈
    友情链接
    Dicky'Blog
    sugi的暗黑木屋
    南京程序员之家
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 在VC++中使用斷言收藏

    新一篇: 使用SoftICE破解Winzip8.0全攻略 | 旧一篇: 加爵锤与狼牙棒

    VC++中使用斷言

    1??????? 斷言的表達形式

    1.1????? 語法

    斷言是一個宏,格式為: ASSERT( 邏輯表達式 booleanExpression)

    邏輯表達式可以是任意一個表達式,其值是0或者非0。

    從代碼的可讀性角度來講,這個表達式應該是不包含與布爾型變量的邏輯比較操作的。

    1.2????? 作用

    斷言僅僅在Debug過程中產生作用。

    當邏輯表達式出現了FALSE(0)的時候,編譯程序將自動停止程序的運行,並給出相關的程序診斷信息。

    對於Release版本的代碼,ASSERT宏不會被處理,因而不會對程序的正常運行其任何阻攔作用。對於MFC,假如希望在Release版本中依然有類似的功能,可以使用VERIFY宏。該宏作用和斷言類似。

    1.3????? 診斷信息

    assertion failed in file in line

    以上為診斷信息的格式。其中file name代表了出錯程序代碼所在的文件,line number是該出現問題的斷言所在行。

    2??????? 斷言的使用方法

    2.1????? 函數調用正確性檢查

    可以檢查函數參數的合理性。

    在實際工作中,有些函數需要輸入參數滿足一些假定條件,而這些約束條件不是數據類型可以滿足的。比如下面的代碼,要根據三個邊長求一個直角三角形的某些參數,必須確認這三個邊長是合理的。

    Type GetValue(int a, int b, int c)

    {

    ??? ASSERT( (a <= c) && (b <= c) ) //specify the third parameter as the largest

    ??? ASSERT( (a * a + b * b) == c*c )

    ??? //To do something

    ………

    //End function

    }

    在這裡,斷言第三個參數必須是最大的邊長,之後,進一步要求兩個短邊的平方和必須等於長邊的平方。

    類似的,我們可以用判斷主調給出的指針是否有效。

    ……

    ASSERT(NULL != pOutBuffer)

    …...

    在函數內檢測參數的合理性有兩個好處:

    1 保證函數本身的健壯性;

    2 使問題容易定位。

    主調給出的參數有時候可能是莫名其妙的,使用斷言,能夠發現許多難以發現的邏輯錯誤。

    2.2????? 檢查內存分配

    MFC中,由於windows的虛擬內存,Release以後的程序是不可能耗盡內存的。因此,如果用普通代碼檢查分配內存成功與否,效率是不合算的,最好使用斷言。

    例如:

    ……

    pBuf = (char *) malloc( sizeof(char) * 100 );

    ASSERT( NULL != pBuf )

    ……

    這樣既不降低碼執行效率,又能檢查分配內存是否成功。

    2.3????? 防治野指針

    大概在定義指針的時候人人都懂得初始化吧:

    int *pCount = NULL;

    然後分配空間,

    pCount = new int[ 10 ];

     process…

    ? 之後釋放空間:

     delete []pCount;

     這時候,pCount指向哪裡呢? 還是原來的地址,然而改地址已經被系統釋放了,於是這個指針就變成了野指針”,如果使用,必然導致錯誤。在這裡,應該使用斷言來確保賦了NULL值。

     pCount = NULL;

    ? ……

    ? ASSERT ( NULL == pCount ); //if you’ve forgotten delete,here will output an alart.

    ? 牢記,在給一個指針釋放空間之後用斷言確保這個指針已經賦了NULL,以免出現野指針。

    2.4????? MSDN範例

    // example for ASSERT
    CAge* pcage = new Cage[ 21 ]; // CAge is derived from CObject.
    ASSERT( pcage!= NULL )
    ASSERT( pcage->IsKindOf( RUNTIME_CLASS( CAge ) ) )
    // Terminates program only if pcage is NOT a CAge*.

    以上為MSDN中對於斷言使用的範例,在這裡確保了pcage指向的對象是有效的Cage類。

    3??????? 注意事項

    1 斷言捕捉的是非法操作的情況,而不是錯誤。不要試圖用斷言來排錯。

    2 一旦函數對參數有任何假定,一定要在函數的入口處使用斷言來確認假定是否實現。

    3 給每一個斷言加上注釋,以便使斷言有目的的防錯。

    ?

    參考資料

    1 Steve Maguire, Writing Clean Code.

    2林銳,高質量C/C++編程指南

    3 Microsoft,MSDN document

    ?

    V1.0 2003/9/9

    发表于 @ 2004年08月19日 14:27:00|评论(loading...)|编辑

    新一篇: 使用SoftICE破解Winzip8.0全攻略 | 旧一篇: 加爵锤与狼牙棒

    评论

    #Saimen 发表于2005-03-06 01:42:00  IP: 220.113.98.*
    偶在CSDN论坛里看到您写的文章,转到我BLOG里收集了,可不可以啊

    另外,关于您说的断言,我想补充一点

    ASSERT 只在DEBUG 模式下运行,在 RELEASE 模式下是不运行的
    MSDN:
    Note This function is available only in the Debug version of MFC

    在RELEASE 下是用 VERIFY

    呵呵
    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © 花差花差