• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            春暖花開(kāi)
            雪化了,花開(kāi)了,春天來(lái)了
            posts - 149,comments - 125,trackbacks - 0

            下面摘自http://m.shnenglu.com/woaidongmao/archive/2008/11/03/65897.html

            看到他們的在爭(zhēng)論很有意思,我不是很懂。

            有利還是有弊呢?


            EXT_ASSERT將ASSERT與if結(jié)合在一起

            ASSERT在DEBUG程序時(shí)候幫了太多太多忙,不過(guò)在ASSERT判斷傳入?yún)?shù)后,還需要if再按相同條件判斷一遍,不符合規(guī)則return,這樣才是正確的邏輯。但這樣代碼難看,且工作重復(fù)無(wú)趣,又容易出現(xiàn)差漏。

            剛弄了個(gè)簡(jiǎn)單EXT_ASSERT宏,按我的理解應(yīng)該可以解決問(wèn)題,但不確定是否有漏洞,發(fā)出來(lái)大家一起瞄瞄。

             

            #define RET_VOID
            #define EX_ASSERT(exp, ret) {ASSERT(exp);if(!(exp))return(ret);}

             

            BOOL CXXX::FunXXX(const data* p_data)
            {
               EXT_ASSERT(p_data, FALSE);//---- 返回BOOL型

            }

            int CXXX::FunXXX(const data* p_data)
            {
               EXT_ASSERT(p_data, -1);//---- 返回int型

            }

            const retdata* CXXX::FunXXX(const data* p_data)
            {
                EXT_ASSERT(p_data, NULL);//---- 返回NULL指針

            }

            retdata CXXX::FunXXX(const data* p_data)
            {
                EXT_ASSERT(p_data, retdata());//---- 返回空對(duì)象

            }

            void CXXX::FunXXX(const data* p_data)
            {
                EXT_ASSERT(p_data, RET_VOID);//---- 僅僅return

            }

            posted on 2008-11-03 23:34 肥仔 閱讀(333) 評(píng)論(7)  編輯 收藏 引用 所屬分類(lèi): C++存檔

            評(píng)論

            # re: EXT_ASSERT將ASSERT與if結(jié)合在一起  回復(fù)  更多評(píng)論   

            哥們兒,如果你是說(shuō)MFC里的ASSERT的話(huà)(看你的類(lèi)命名風(fēng)格,估計(jì)是吧),在retail build里,ASSERT是完全不會(huì)被放到代碼里的。你這樣用ASSERT,把ASSERT和if條件綁在一起就等于把處理錯(cuò)誤的斷言和正常程序邏輯綁在了一起,不是一個(gè)好的設(shè)計(jì)。如果一定要這么干,也該是綁VERIFY,至少在retail build里VERIFY里的邏輯還會(huì)被執(zhí)行。

            ASSERT應(yīng)該拿來(lái)斷言程序正常執(zhí)行完全不可能出現(xiàn)的錯(cuò)誤(這些錯(cuò)誤會(huì)在debug build里出現(xiàn)是因?yàn)楫?dāng)前程序還不完善),在正常邏輯中,他們是不應(yīng)該用程序邏輯去handle的錯(cuò)誤,所以一句ASSERT夠了。
            2008-11-04 05:27 | www.helpsoff.com.cn

            # re: EXT_ASSERT將ASSERT與if結(jié)合在一起  回復(fù)  更多評(píng)論   

            @www.helpsoff.com.cn
            我在Imperfect C++中看到過(guò)相同的言論。
            不過(guò)我的應(yīng)用是,常常用ASSERT檢測(cè)參數(shù)的合法性,ASSERT之后,當(dāng)然還要if一把了,對(duì)于ASSERT和if不要放在一起這種觀點(diǎn),我不是很認(rèn)同,我覺(jué)得放在一起很好用的。

            另外,在Release下,ASSERT沒(méi)了,但是if留下了,這是需要的效果。
            2008-11-04 10:45 | 肥仔

            # re: EXT_ASSERT將ASSERT與if結(jié)合在一起  回復(fù)  更多評(píng)論   

            我不會(huì)這么用,斷言的目的去那了。
            2008-11-04 11:30 | Touchsoft

            # re: EXT_ASSERT將ASSERT與if結(jié)合在一起  回復(fù)  更多評(píng)論   

            @肥仔
            哥們兒,你還是沒(méi)理解,ASSERT的不是拿來(lái)干這個(gè)的。你愛(ài)怎樣玩就怎樣玩吧,反正自己的代碼自己維護(hù),其他人的意見(jiàn)聽(tīng)不聽(tīng)在你。
            2008-11-04 12:29 | www.helpsoff.com.cn

            # re: EXT_ASSERT將ASSERT與if結(jié)合在一起  回復(fù)  更多評(píng)論   

            @www.helpsoff.com.cn
            謝謝你的意見(jiàn),但是不采納。原因有3點(diǎn)經(jīng)歷:

            1、ASSERT判斷函數(shù)參數(shù)合法性,調(diào)試時(shí)會(huì)幫了很大的忙;
            2、if判段函數(shù)參數(shù)合法性,是健壯性的一部分;
            3、ASSERT和if 合在一起,不覺(jué)得有任何不妥,且ASSERT不出現(xiàn)在Release中,這正是需要的。

            可能涉及到的一個(gè)爭(zhēng)論是,檢測(cè)參數(shù)合法形是調(diào)用者,還是被調(diào)用者的責(zé)任?
            C/C++的主流是調(diào)用者保證參數(shù)的合法性,被調(diào)用者不檢測(cè)參數(shù)合法性,這就是為什么認(rèn)為,只要ASSERT,不需要if了。
            strcpy(szBuf, NULL)之所以讓一個(gè)程序崩潰也是這個(gè)原因,但是為什么要讓它崩潰?能夠不崩潰,繼續(xù)執(zhí)行豈不是更好嗎?
            2008-11-04 13:44 | 肥仔

            # re: EXT_ASSERT將ASSERT與if結(jié)合在一起  回復(fù)  更多評(píng)論   

            1) 沒(méi)人否認(rèn)ASSERT的用處;
            2) 需要if判斷處理的參數(shù)和用ASSERT斷言的不合法參數(shù),不應(yīng)屬于一個(gè)范疇,不應(yīng)該混合在一起處理;
            3) 代碼不管怎么寫(xiě)在沒(méi)遇到問(wèn)題前都不會(huì)有什么不妥,自己覺(jué)得好就好吧。

            你當(dāng)然可以去寫(xiě)一個(gè)萬(wàn)能的strcpy,但是如何能保證你的strcpy是真正的“萬(wàn)能”的呢?不崩潰繼續(xù)執(zhí)行倒是沒(méi)問(wèn)題,但是出問(wèn)題的真正根源在哪里呢,你這樣做不就掩蓋了問(wèn)題嗎?應(yīng)該做的是出現(xiàn)這樣的問(wèn)題時(shí),能有用且有效的指出錯(cuò)誤,而不是做garbage in, garbage out。

            設(shè)計(jì)代碼,不去扯那些玩得出花花的設(shè)計(jì)模式,有些很基本很直白的原則,比如說(shuō)“garbage in, garbage out”,比如高內(nèi)聚/低耦合...說(shuō)多了也沒(méi)意思,樓主愛(ài)怎么玩怎么玩,大家都是這么過(guò)來(lái)的,其中的東西自己去體會(huì)了。
            2008-11-04 15:35 | www.helpsoff.com.cn

            # re: EXT_ASSERT將ASSERT與if結(jié)合在一起  回復(fù)  更多評(píng)論   

            @www.helpsoff.com.cn
            程序以外,人生很多地方都需要與別人探討,對(duì)于不合己見(jiàn)者,請(qǐng)不必太在懷,更沒(méi)必要帶著情緒和語(yǔ)氣,擺出姿態(tài)。這樣才能贏得更多的合作,我想我的這幾句話(huà)還算中肯。
            2008-11-04 16:32 | 肥仔
            posted on 2008-11-04 18:28 Sandy 閱讀(395) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): c++學(xué)習(xí)
            热久久最新网站获取| 国产成人无码久久久精品一| 久久99热这里只频精品6| 久久精品国产亚洲AV久| 91久久精一区二区三区大全| 日产久久强奸免费的看| 久久精品欧美日韩精品| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 一级a性色生活片久久无| 久久夜色精品国产噜噜噜亚洲AV | 93精91精品国产综合久久香蕉| 午夜精品久久久久久影视777| 久久精品www人人爽人人| 久久综合九色综合欧美就去吻| 午夜精品久久久久久中宇| 精品久久久久久无码中文字幕| 久久久精品人妻一区二区三区四 | 中文字幕精品久久| 99久久www免费人成精品| 色婷婷综合久久久久中文| 久久久WWW成人| 久久久久免费精品国产| 77777亚洲午夜久久多喷| 久久精品99无色码中文字幕| 国产日产久久高清欧美一区| 伊人久久大香线蕉综合影院首页| 欧美国产精品久久高清| 久久精品免费网站网| 午夜不卡888久久| 中文无码久久精品| 亚洲国产香蕉人人爽成AV片久久 | 免费精品久久久久久中文字幕 | 久久久网中文字幕| 久久精品9988| 国产成人综合久久精品尤物| 久久亚洲国产欧洲精品一| 狠狠色丁香婷综合久久| 九九99精品久久久久久| 国产精品久久久久久影院| 国内精品久久久久影院免费| 久久噜噜电影你懂的|