C語言中do while 0 的妙用

2021-07-11 13:19:07 字數 2082 閱讀 9754

在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),於是得到下面的**:

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

) printf(

"arg is %s\n

", blah);

do_something_useful(blah);;

我們就會發現,if語句只作用於printf(), do_something_useful() 沒按照願意一起執行,即沒有像你預期的那樣被包含在if**中,於是可以使用如下的**塊:

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 有很多作用,下面舉出幾個 通常,如果乙個函式開始要分配一些資源,然後如果在中途遇到錯誤則要退出函式,當然,退出前要釋放資源,我們的 可能如下 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...