在linux核心**中,經常看到do...while(0)的巨集,do...while(0)有很多作用,下面舉出幾個:
通常,如果乙個函式開始要分配一些資源,然後如果在中途遇到錯誤則要退出函式,當然,退出前要釋放資源,我們的**可能如下:
1 #defien n 1023c**這裡最大的問題是**冗餘,每增加乙個操作,就要做相應的錯誤處理,非常不靈活,於是想到了一下的goto:bool
execute()417
18 bok =func2();
19if(!bok)
2025
26 bok =func3();
27if(!bok)
2833
34//
..........
3536
//執行成功,釋放資源並返回
37free(p);
38 p =null;
39return
true
;40 }
1 #defien n 1023c****冗餘是解決了,但是引入了c語言中比較微妙的goto語句,雖然正確的使用goto語句可以大大提高程式的靈活性與簡潔性,但是會使我們的程式捉摸不定,為了既避免使用goto語句,又能消除**冗餘,可以考慮使用下面的 do...while(0):bool
execute()
4
1 #defien n 1023c**在linux核心源**中,經常看到如下巨集以避免在編譯時出現警告:bool
execute()
4 while(0
);23
24//
釋放資源
2526
free(p);
27 p =null;
28return
bok;
29 }
#define foo do while(0)你可能經常會使用如下的巨集:
#define exch(x,y)然而在某些情況下將會失效,下面的**使用if...else...
if (x >y)但是將被解釋為乙個分支的if語句:exch(x,y);
//分支 1
else
do_something();
//分支 2
if (x >y)錯誤出在「;」直接位於**塊的後面,解決的辦法是將**嵌入do...while(0),於是得到下面的**:;
//空語句
else
//error!!!
do_something();
1於是上面的巨集可以修改為:if (x >y)2do
while(0);8
else
9 do_something();
1假如乙個巨集包含類似如下幾行**:#define exch(x,y) do while(0)
#define foo(x) \printf(現在想像一下下面的**:"arg is %s\n
", x); \
do_something_useful(x);
if (blah == 2這將解釋為:) foo(blah);
if (blah == 2我們就會發現,if語句只作用於printf(), do_something_useful() 沒按照願意一起執行,即沒有像你預期的那樣被包含在if**中,於是可以使用如下的**塊:) printf(
"arg is %s\n
", blah);
do_something_useful(blah);;
if (blah == 2這樣上面的巨集就可以改為:) do
while (0);
1#define foo(x) do while (0)
C語言中do while 0 的妙用
在linux核心 中,經常看到do.while 0 的巨集,do.while 0 有很多作用,下面舉出幾個 通常,如果乙個函式開始要分配一些資源,然後如果在中途遇到錯誤則要退出函式,當然,退出前要釋放資源,我們的 可能如下 defien n 10 bool execute bok func2 if ...
C語言中do while 0 的妙用
在linux核心 中,經常看到do.while 0 的巨集,do.while 0 有很多作用,下面舉出幾個 通常,如果乙個函式開始要分配一些資源,然後如果在中途遇到錯誤則要退出函式,當然,退出前要釋放資源,我們的 可能如下 defien n 10 bool execute bok func2 if ...
程式設計技巧 do while 0 的妙用
在c 中,有三種型別的迴圈語句 for,while,和do.while,但是在一般應用中作迴圈時,我們可能用for和while要多一些,do.while相對不受重視。但是,最近在讀我們專案的 時,卻發現了do.while的一些十分聰明的用法,不是用來做迴圈,而是用作其他來提高 的健壯性。1.do.w...