程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言中do...while(0)用法小結

C語言中do...while(0)用法小結

編輯:關於C語言

在linux內核代碼中,經常看到do...while(0)的宏,do...while(0)有很多作用,下面舉出幾個:

本文地址:http://www.cnblogs.com/archimedes/p/do-while-0.html,轉載請注明源地址。

1、避免goto語句:

通常,如果一個函數開始要分配一些資源,然後如果在中途遇到錯誤則要退出函數,當然,退出前要釋放資源,我們的代碼可能如下: 

View Code

這裡最大的問題是代碼冗余,每增加一個操作,就要做相應的錯誤處理,非常不靈活,於是想到了一下的goto:

View Code

代碼冗余是解決了,但是引入了C語言中比較微妙的goto語句,雖然正確的使用goto語句可以大大提高程序的靈活性與簡潔性,但是會使我們的程序捉摸不定,為了既避免使用goto語句,又能消除代碼冗余,可以考慮使用下面的 do...while(0):

View Code

2、避免空聲明在編譯時出現警告:

在linux內核源代碼中,經常看到如下宏以避免在編譯時出現警告:

 FOO do { } while(0)

3、編寫符合習慣的代碼塊:

你可能經常會使用如下的宏:

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

然而在某些情況下將會失效,下面的代碼使用if...else...

 (x >

但是將被解釋為一個分支的if語句:

 (x >===
                        
        do_something();

錯誤出在“;”直接位於代碼塊的後面,解決的辦法是將代碼嵌入do...while(0),於是得到下面的代碼:

 (x >===(

 於是上面的宏可以修改為:

 exch(x,y)       do {\
                ===()

4、在條件語句中使用復雜的宏:

假如一個宏包含類似如下幾行代碼:

 FOO(x) \

現在想像一下下面的代碼:

 (blah == 

 (blah == 

 (blah ==  ();

  FOO(x) do { \ ()

 

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved