熱烈祝賀臺州維博網絡的站長論壇隆重上線!(2012-05-28)    熱烈慶祝偉大的祖國60周年生日 點擊進來我們一起為她祝福吧(2009-09-26)    站長論壇禁止發布廣告,一經發現立即刪除。謝謝各位合作!.(2009-08-08)    熱烈祝賀臺州網址導航全面升級,全新版本上線!希望各位一如既往地支持臺州網址導航的發展.(2009-03-28)    臺州站長論壇恭祝各位新年快樂,牛年行大運!(2009-01-24)    臺州Link正式更名為臺州網址導航,專業做以臺州網址為主的網址導航!(2008-05-23)    熱烈祝賀臺州Link資訊改名為中國站長資訊!希望在以后日子里得到大家的大力支持和幫助!(2008-04-10)    熱烈祝賀臺州Link論壇改名為臺州站長論壇!希望大家繼續支持和鼓勵!(2008-04-10)    臺州站長論壇原[社會瑣碎]版塊更名為[生活百科]版塊!(2007-09-05)    特此通知:新臺州站長論壇的數據信息全部升級成功!">特此通知:新臺州站長論壇的數據信息全部升級成功!(2007-09-01)    臺州站長論壇對未通過驗證的會員進行合理的清除,請您諒解(2007-08-30)    臺州網址導航|上網導航誠邀世界各地的網站友情鏈接和友誼聯盟,共同引領網站導航、前進!(2007-08-30)    禁止發廣告之類的帖,已發現立即刪除!(2007-08-30)    希望各位上傳與下載有用資源和最新信息(2007-08-30)    熱烈祝賀臺州站長論壇全面升級成功,全新上線!(2007-08-30)    
便民網址導航,輕松網上沖浪。
臺州維博網絡專業開發網站門戶平臺系統
您當前的位置: 首頁 » Linux內核/嵌入技術 » 內核中的do while(0)

內核中的do while(0)

論壇鏈接
  • 內核中的do while(0)
  • 發布時間:2010-11-09 17:00:51    瀏覽數:5921    發布者:abcdef133    設置字體【   
為什么在內核中碰到很多 #defines ... do{ ... } while(0)?

  有以下幾點原因:

  ·空語句在編譯時候會出現警告,所以有必要用#define FOO do { } while(0).

  ·這樣做是為了能夠在里面定義局部變量

  ·這樣做是為了能夠在條件語句中使用復雜的宏定義. 例如下面這段代碼:

  #define FOO(x) \

  printf("arg is %s\n", x); \

  do_something_useful(x);

  如果這樣用:

  if (blah == 2)

  FOO(blah);

  將會被展開為:

  if (blah == 2)

  printf("arg is %s\n", blah);

  do_something_useful(blah);;

  這樣,if條件之包含了printf()語句,而 do_something_useful()調用不能按期望那樣工作。而使用 do { ... } while(0)定義后,就會展開成以下語句:

  if (blah == 2)

  do {

  printf("arg is %s\n", blah);

  do_something_useful(blah);

  } while (0);

  這是所期望的狀況.

  ·如果你希望定義一個包含多行語句和一些局部變量的時候. 一般的定義方式只能這樣:

  #define exch(x,y) { int tmp; tmp=x; x=y; y=tmp; }

  然而在某些情況下,這樣并不能正常工作. 下面是包含兩個分支的if語句:

  if (x > y)

  exch(x,y); // Branch 1

  else

  do_something(); // Branch 2

  但這樣卻只能展開成單分支的if語句,如下:

  if (x > y) { // 單分支if

  int tmp;

  tmp = x;

  x = y;

  y = tmp;

  }

  ; // 空語句

  else // 錯誤!!! "parse error before else"

  do_something();

  問題是由于在語句塊后直接加入分號(;)引起的. 解決辦法是將語句塊放入 do 和 while (0)中間.這樣就得到了一條單語句, 而不是被編譯器判斷為語句塊.現在的if語句如下:

  if (x > y)

  do {

  int tmp;

  tmp = x;

  x = y;

  y = tmp;

  } while(0);

  else

  do_something();
娛樂休閑專區A 影視預告B 音樂咖啡C 英語階梯D 生活百科
網頁編程專區E AMPZF HTMLG CSSH JSI ASPJ PHPK JSPL MySQLM AJAX
Linux技術區 N 系統管理O 服務器架設P 網絡/硬件Q 編程序開發R 內核/嵌入
管理中心專區S 發布網址T 版主議事U 事務處理
陕西快乐10分玩法 快乐8平台是真的吗 彩票北京pk拾是官方开的吗 牛势策略 澳洲快乐8技巧 山东11选五走势图彩 甘肃快3什么时候开始 上海时时乐和值分析 内蒙古快三组合走势图一定牛 内蒙古快3技巧 炒股是什么意思