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