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

            文章均收錄自他人博客,但不喜標題前加-[轉貼],因其丑陋,見諒!~
            隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
            數據加載中……

            do..while(0)的用法

            真是的,我用C++還是太少了。這個宏以前明明見過的,但其存在的意義突然就想不起來了。剛才問了下axx大才又知道了一次。趕緊記下來。

            這樣的宏見過么:

            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)后面沒有分號)

            乍一看這個宏不過就是定義了個包含多個語句的local scope,用do..while(0)包圍起來簡直多此一舉。直接這樣不就好了么:

            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;\
            }



            但問題是這兩者不等價……

            關鍵問題是前者定義出來的宏是一個非復合語句,而后者是一個復合語句。C/C++里有些語法結構對復合/非復合語句之間的區別是敏感的,例如說:

            Cpp代碼 clip_image001

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


            要是FOO(x)展開后是一個復合語句,那么FOO(x)后面的分號“;”就會終結整個if語句,導致else子句孤立而出現編譯錯誤。
            所以關鍵是那個while(0)后面不加分號。如果加了分號的話就沒意義了。

            如果用復合語句版本的宏,就要記得不寫那個分號:

            Cpp代碼 clip_image001

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


            但是這樣與一般的函數調用風格不統一,所以很多人傾向于使用do..while(0)這個trick來把local scope包起來而不是直接用復合語句({..})。

            印象中這類的宏還有一個變種,

            Cpp代碼 clip_image001

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


            還是怎樣的。具體是怎么寫的忘記了……以后想起來的話一定得記下來 T T

             

             

            do...while(false)的妙用

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

            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}

            最后造成一大堆括號,寫起來不舒服,可讀性也很差。

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

            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}


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

             

            posted on 2009-03-11 13:09 肥仔 閱讀(4055) 評論(0)  編輯 收藏 引用 所屬分類: C++ 基礎

            国产精品视频久久久| 久久亚洲精品无码播放| 国产欧美久久一区二区| 国产 亚洲 欧美 另类 久久| 久久九色综合九色99伊人| 亚洲欧美一级久久精品| 久久大香香蕉国产| 亚洲AⅤ优女AV综合久久久| 久久免费的精品国产V∧| 国产精品成人99久久久久91gav| 亚洲精品高清一二区久久| 国产精品99久久99久久久| 精品国产婷婷久久久| 久久人人爽人人爽人人AV| 人人狠狠综合久久亚洲婷婷| 久久久久亚洲av综合波多野结衣| 99久久无码一区人妻a黑| 久久亚洲AV成人无码软件 | 精品国产婷婷久久久| 狠狠色狠狠色综合久久| 欧美亚洲另类久久综合| 国产亚洲精久久久久久无码77777| 国产精品天天影视久久综合网| 久久久久免费精品国产| 久久久久亚洲av毛片大| 国产福利电影一区二区三区,免费久久久久久久精 | 久久天天躁狠狠躁夜夜躁2014 | 青青热久久国产久精品 | 国产精品久久精品| 亚洲AV无码1区2区久久| 久久99这里只有精品国产| 99久久国产亚洲高清观看2024| 久久无码人妻一区二区三区午夜| 波多野结衣久久| 亚洲天堂久久久| 久久综合偷偷噜噜噜色| 亚洲国产综合久久天堂 | 色婷婷久久综合中文久久蜜桃av| 性欧美大战久久久久久久| 久久国产AVJUST麻豆| 久久久亚洲欧洲日产国码是AV|