青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

do{...}while(0)的意義和用法 (轉)

(peakflys注:本篇文章轉自  http://blogread.cn/it/article/5907?f=hot3)

     linux內核和其他一些開源的代碼中,經常會遇到這樣的代碼:

do{  ... }while(0)

    這樣的代碼一看就不是一個循環,do..while表面上在這里一點意義都沒有,那么為什么要這么用呢?

    實際上,do{...}while(0)的作用遠大于美化你的代碼。查了些資料,總結起來這樣寫主要有以下幾點好處:

    1、輔助定義復雜的宏,避免引用的時候出錯:

    舉例來說,假設你需要定義這樣一個宏:

#define DOSOMETHING()\\                
foo1();\\
foo2();

    這個宏的本意是,當調用DOSOMETHING()時,函數foo1()和foo2()都會被調用。但是如果你在調用的時候這么寫:

if(a>0)     DOSOMETHING();

    因為宏在預處理的時候會直接被展開,你實際上寫的代碼是這個樣子的:

if(a>0)     
   foo1();
foo2();

    這就出現了問題,因為無論a是否大于0,foo2()都會被執行,導致程序出錯。

    那么僅僅使用{}將foo1()和foo2()包起來行么?

    我們在寫代碼的時候都習慣在語句右面加上分號,如果在宏中使用{},代碼里就相當于這樣寫了:“{...};”,展開后就是這個樣子:

if(a>0) {     foo1();     foo2(); };

    這樣甚至不會編譯通過。所以,很多人才采用了do{...}while(0);

#define DOSOMETHING() \\         
do{ \\
foo1();\\
foo2();\\
}while(0)\\
...  
if(a>0)
DOSOMETHING();  
...

    這樣,宏被展開后,才會保留初始的語義。GCC提供了Statement-Expressions用以替代do{...}while(0); 所以你也可以這樣定義宏:

#define DOSOMETHING() ({\\         
foo1(); \\
foo2(); \\
})

     2、避免使用goto對程序流進行統一的控制:

    有些函數中,在函數return之前我們經常會進行一些收尾的工作,比如free掉一塊函數開始malloc的內存,goto一直都是一個比較簡便的方法:

int foo() 
{
   somestruct* ptr = malloc(...);  
   dosomething...;
   if(error)
   {
      goto END;
   }  
   dosomething...;
   if(error)
   {
      goto END;
   }
   dosomething...;  
END:
   free(ptr);
   return 0;  
}

    由于goto不符合軟件工程的結構化,而且有可能使得代碼難懂,所以很多人都不倡導使用,那這個時候就可以用do{}while(0)來進行統一的管理:

int foo() 
{  
   somestruct* ptr = malloc(...);  
   do{
      dosomething...;
      if(error)
      {
         break;
      }  
      dosomething...;
      if(error)
      {
         break;
      }
      dosomething...;
   }while(0);  
   free(ptr);
   return 0;  
}

    這里將函數主體使用do()while(0)包含起來,使用break來代替goto,后續的處理工作在while之后,就能夠達到同樣的效果。

    3、避免空宏引起的warning

    內核中由于不同架構的限制,很多時候會用到空宏,在編譯的時候,空宏會給出warning,為了避免這樣的warning,就可以使用do{}while(0)來定義空宏:

#define EMPTYMICRO do{}while(0)

    4、定義一個單獨的函數塊來實現復雜的操作:

    當你的功能很復雜,變量很多你又不愿意增加一個函數的時候,使用do{}while(0);,將你的代碼寫在里面,里面可以定義變量而不用考慮變量名會同函數之前或者之后的重復。

posted on 2014-07-28 16:11 peakflys 閱讀(98) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


<2025年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

導航

統計

公告

人不淡定的時候,就愛表現出來,敲代碼如此,偶爾的靈感亦如此……

常用鏈接

留言簿(4)

隨筆分類

隨筆檔案

文章檔案

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美在线免费观看亚洲| 亚洲一区二区三区免费观看| 久久婷婷色综合| 久久亚裔精品欧美| 欧美成人自拍| 一本久久知道综合久久| 国产精品一二三视频| 久久噜噜噜精品国产亚洲综合| 亚洲高清二区| 亚洲在线日韩| 在线免费观看视频一区| 欧美日韩亚洲三区| 久久久久久久国产| 一本色道久久综合狠狠躁的推荐| 久久久久久久性| 一本一本大道香蕉久在线精品| 国产日韩精品在线| 欧美日韩视频在线第一区| 久久成人国产精品| 国产精品99久久久久久人| 免费视频久久| 久久美女艺术照精彩视频福利播放| 亚洲精品123区| 激情成人av| 国产精品乱人伦一区二区| 欧美高清在线一区| 久久亚洲综合色一区二区三区| 中日韩在线视频| 亚洲区一区二| 亚洲国产精品传媒在线观看 | 国产精品捆绑调教| 欧美另类在线播放| 欧美激情欧美激情在线五月| 久久影院午夜片一区| 欧美一级片一区| 香蕉亚洲视频| 亚欧成人精品| 性伦欧美刺激片在线观看| 在线亚洲国产精品网站| 亚洲精品四区| 91久久午夜| 亚洲精品一区二区三| 欧美成人午夜激情视频| 欧美黄在线观看| 欧美黑人在线观看| 亚洲国产精品一区二区第一页| 欧美超级免费视 在线| 欧美不卡在线视频| 91久久久久| 夜夜嗨av一区二区三区免费区| 亚洲精品资源| 亚洲精品一区二区三区在线观看 | 国产一区二区剧情av在线| 国产精品久久二区| 国产精品视频| 狠狠色综合网站久久久久久久| 在线电影一区| 91久久国产综合久久蜜月精品| 亚洲激情成人在线| 正在播放欧美一区| 午夜精品视频在线| 久久婷婷综合激情| 亚洲电影在线免费观看| 亚洲精品小视频在线观看| 亚洲视频一二区| 午夜精品久久久99热福利| 久久久国产精品一区二区三区| 久久亚洲欧美| 欧美日本国产一区| 国产精品久久久久毛片大屁完整版 | 国产欧美日韩一级| 亚洲第一区在线观看| 一区二区高清视频| 久久久国产精品亚洲一区| 欧美激情2020午夜免费观看| 中日韩美女免费视频网址在线观看 | 麻豆精品一区二区av白丝在线| 欧美精品久久99| 国产欧美亚洲日本| 日韩视频专区| 久久综合久久久久88| 亚洲精品日产精品乱码不卡| 亚洲在线中文字幕| 欧美国产日韩精品免费观看| 国产毛片一区二区| 亚洲国产裸拍裸体视频在线观看乱了中文 | 欧美国产综合视频| 国产日韩久久| 一本色道久久综合亚洲精品按摩| 久久久久国产一区二区三区四区| 亚洲高清免费在线| 欧美一区影院| 欧美特黄视频| 日韩视频免费观看| 免费在线成人av| 亚洲免费一级电影| 一区二区久久久久久| 亚洲电影毛片| 亚洲专区在线视频| 欧美日韩高清在线观看| 一区福利视频| 欧美中文字幕视频| 亚洲视屏在线播放| 欧美日韩人人澡狠狠躁视频| 亚洲国产天堂久久国产91| 欧美在线中文字幕| 亚洲一区二区三区乱码aⅴ蜜桃女 亚洲一区二区三区乱码aⅴ | 亚洲一区二区视频在线| 欧美电影免费| 久久综合伊人| 在线免费观看视频一区| 久久久夜夜夜| 欧美专区一区二区三区| 国产精品亚洲第一区在线暖暖韩国| 日韩视频―中文字幕| 欧美大香线蕉线伊人久久国产精品| 欧美专区福利在线| 红桃视频国产一区| 久久免费99精品久久久久久| 亚洲欧美国产日韩中文字幕| 国产精品萝li| 久久精品av麻豆的观看方式| 午夜伦理片一区| 国产三级精品三级| 久久青青草综合| 老色鬼久久亚洲一区二区 | 亚洲国产国产亚洲一二三| 久久综合久久综合久久综合| 久久国产精品一区二区三区| 亚洲国产mv| 亚洲精品久久久久久一区二区| 欧美a一区二区| 亚洲一区制服诱惑| 亚洲一区三区电影在线观看| 国产精品揄拍500视频| 久久久亚洲一区| 猫咪成人在线观看| 一本色道久久综合狠狠躁篇的优点 | 亚洲国产精品尤物yw在线观看| 欧美大片网址| 亚洲一区免费| 久久精品毛片| 999在线观看精品免费不卡网站| 99国产精品99久久久久久| 国产美女精品一区二区三区| 久久成人在线| 欧美成人午夜激情| 亚洲欧美日韩电影| 美女视频黄免费的久久| 亚洲国产综合视频在线观看| 欧美视频免费在线| 久久国产精品久久国产精品| 欧美11—12娇小xxxx| 亚洲一二三级电影| 久久全球大尺度高清视频| 日韩小视频在线观看| 一本一本a久久| 亚洲国产99精品国自产| 亚洲视频自拍偷拍| 亚洲黄色成人网| 午夜精品久久久久久久久久久久久| 亚洲激情视频在线观看| 亚洲在线观看免费视频| 亚洲人成欧美中文字幕| 亚洲欧美日韩专区| 亚洲黄色一区| 午夜精品电影| 亚洲在线观看视频网站| 老司机精品视频一区二区三区| 欧美一区二粉嫩精品国产一线天| 裸体丰满少妇做受久久99精品| 午夜免费久久久久| 欧美福利在线| 欧美电影免费观看高清完整版| 国产日韩欧美制服另类| 99国内精品| 999亚洲国产精| 女同性一区二区三区人了人一| 久久精品午夜| 国产精品视频一二三| 日韩视频中午一区| 亚洲精品小视频| 美女被久久久| 免费观看在线综合色| 欧美日韩一二三区| 亚洲国产va精品久久久不卡综合| 国产一区二区主播在线| 亚洲欧美在线一区| 中文在线不卡| 国产精品v欧美精品v日韩精品| 亚洲高清123| 亚洲剧情一区二区| 欧美大片专区| 亚洲精品久久久久| 99re8这里有精品热视频免费| 欧美成人一区二区在线| 亚洲国产黄色片| 99热在线精品观看| 欧美日韩精品不卡| 亚洲美女在线观看|