• <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>

            woaidongmao

            文章均收錄自他人博客,但不喜標(biāo)題前加-[轉(zhuǎn)貼],因其丑陋,見(jiàn)諒!~
            隨筆 - 1469, 文章 - 0, 評(píng)論 - 661, 引用 - 0
            數(shù)據(jù)加載中……

            do..while(0)的用法

            真是的,我用C++還是太少了。這個(gè)宏以前明明見(jiàn)過(guò)的,但其存在的意義突然就想不起來(lái)了。剛才問(wèn)了下axx大才又知道了一次。趕緊記下來(lái)。

            這樣的宏見(jiàn)過(guò)么:

            Cpp代碼 clip_image001

            1. #define FOO(x) do {\  
            2.     some_code_line_1;\  
            3.     some_code_line_2;\  
            4. } while (0) 
            #define FOO(x) do {\
                some_code_line_1;\
                some_code_line_2;\
            } while (0)


            (注意while(0)后面沒(méi)有分號(hào))

            乍一看這個(gè)宏不過(guò)就是定義了個(gè)包含多個(gè)語(yǔ)句的local scope,用do..while(0)包圍起來(lái)簡(jiǎn)直多此一舉。直接這樣不就好了么:

            Cpp代碼 clip_image001

            1. #define FOO(x) {\  
            2.     some_code_line_1;\  
            3.     some_code_line_2;\  
            #define FOO(x) {\
                some_code_line_1;\
                some_code_line_2;\
            }



            但問(wèn)題是這兩者不等價(jià)……

            關(guān)鍵問(wèn)題是前者定義出來(lái)的宏是一個(gè)非復(fù)合語(yǔ)句,而后者是一個(gè)復(fù)合語(yǔ)句。C/C++里有些語(yǔ)法結(jié)構(gòu)對(duì)復(fù)合/非復(fù)合語(yǔ)句之間的區(qū)別是敏感的,例如說(shuō):

            Cpp代碼 clip_image001

            1. if ( someCond )  
            2.     FOO(x);  
            3. else 
            4.     //... 
            if ( someCond )
                FOO(x);
            else
                //...


            要是FOO(x)展開(kāi)后是一個(gè)復(fù)合語(yǔ)句,那么FOO(x)后面的分號(hào)“;”就會(huì)終結(jié)整個(gè)if語(yǔ)句,導(dǎo)致else子句孤立而出現(xiàn)編譯錯(cuò)誤。
            所以關(guān)鍵是那個(gè)while(0)后面不加分號(hào)。如果加了分號(hào)的話(huà)就沒(méi)意義了。

            如果用復(fù)合語(yǔ)句版本的宏,就要記得不寫(xiě)那個(gè)分號(hào):

            Cpp代碼 clip_image001

            1. if ( someCond )  
            2.     FOO(x)  
            3. else 
            4.     //... 
            if ( someCond )
                FOO(x)
            else
                //...


            但是這樣與一般的函數(shù)調(diào)用風(fēng)格不統(tǒng)一,所以很多人傾向于使用do..while(0)這個(gè)trick來(lái)把local scope包起來(lái)而不是直接用復(fù)合語(yǔ)句({..})。

            印象中這類(lèi)的宏還有一個(gè)變種,

            Cpp代碼 clip_image001

            1. #define FOO(x) switch(0) default: ... 
            #define FOO(x) switch(0) default: ...


            還是怎樣的。具體是怎么寫(xiě)的忘記了……以后想起來(lái)的話(huà)一定得記下來(lái) T T

             

             

            do...while(false)的妙用

            今天從Java自由人看到一篇Blogdo...while(false)的探討,剛好解決了一直困擾我的一個(gè)小麻煩clip_image001
            經(jīng)常會(huì)遇到這樣的情況,一大段代碼,中間遇到某種情況,比如someObj == null,需要跳出這段代碼,但是又不在循環(huán)之中,只好處理成這樣:

            clip_image002clip_image003if(someObj != null)clip_image004{
            clip_image005 
            //doSomethingclip_image004
            clip_image005
              clip_image004
            clip_image006clip_image007 
            if(someOther fit someCondition)clip_image004{
            clip_image005    clip_image004
            clip_image008  }

            clip_image009}

            最后造成一大堆括號(hào),寫(xiě)起來(lái)不舒服,可讀性也很差。

            巧用do...while(false)可以解決這個(gè)問(wèn)題,看下面的代碼:

            clip_image010function LTrim(s){
            clip_image010 
            try{
            clip_image010   
            do{
            clip_image010     
            if(null==s||s.length<=0)
            clip_image010       
            break;
            clip_image010     
            var whitespace=" \t\r\n";
            clip_image010     
            if(whitespace.indexOf(s.charAt(0))>=0){
            clip_image010       
            var len=s.length;
            clip_image010       
            var index;
            clip_image010       
            for(index=0;index  if(whitespace.indexOf(s.charAt(index))<0)
            clip_image010           
            break;
            clip_image010       
            if(index s=s.substring(index);
            clip_image010       
            else s="";
            clip_image010      }
            clip_image010    }
            while(false);
            clip_image010  }
            catch(Ab){
            clip_image010  s="";
            clip_image010  }
            clip_image010 
            return s;
            clip_image010}


            這個(gè)函數(shù)是用來(lái)去掉字符串前端的空白。使用do...while(false)的用意就在于在do{}的過(guò)程中可以break,使得函數(shù)唯一的出口就是最后一行的return
            嗯,這是一個(gè)不錯(cuò)的方法。以后可以采用,避免過(guò)多的嵌套括號(hào)。
            (
            以上部分摘抄Blogdo...while(false)的探討)

             

            posted on 2009-03-11 13:09 肥仔 閱讀(4065) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): C++ 基礎(chǔ)

            av国内精品久久久久影院| 99久久综合狠狠综合久久| 久久久久亚洲AV无码观看| 久久免费的精品国产V∧| 久久精品国产亚洲麻豆| 亚洲精品综合久久| 久久亚洲国产成人精品性色| 日韩精品国产自在久久现线拍| 久久精品无码av| 久久久精品国产sm调教网站| 久久久WWW免费人成精品| 精品综合久久久久久97| 一本久久久久久久| 人妻少妇久久中文字幕| 四虎国产精品成人免费久久| 波多野结衣中文字幕久久 | 国产精品久久久久乳精品爆| 91麻豆国产精品91久久久| 国产成人精品久久综合 | 欧美亚洲日本久久精品| 香蕉久久一区二区不卡无毒影院| 伊人久久大香线蕉av不变影院| 亚洲成色WWW久久网站| 久久久久久久国产免费看| 亚洲国产精品久久久久婷婷软件| 性高湖久久久久久久久| 久久亚洲AV成人无码| 看全色黄大色大片免费久久久| 久久精品国产秦先生| 老司机国内精品久久久久| 精品熟女少妇av免费久久| 色欲综合久久躁天天躁蜜桃| 精品国产日韩久久亚洲| 一本色综合久久| 久久久久国产精品人妻| 人妻精品久久久久中文字幕69| 久久人人爽人人爽人人片AV不| 四虎亚洲国产成人久久精品| 国产精品久久久久久久久软件| 亚洲国产香蕉人人爽成AV片久久| 蜜桃麻豆www久久国产精品|