在linux內核代碼中,經常看到do...while(0)的宏,do...while(0)有很多作用,下面舉出幾個:
本文地址:http://www.cnblogs.com/archimedes/p/do-while-0.html,轉載請注明源地址。
通常,如果一個函數開始要分配一些資源,然後如果在中途遇到錯誤則要退出函數,當然,退出前要釋放資源,我們的代碼可能如下:
View Code這裡最大的問題是代碼冗余,每增加一個操作,就要做相應的錯誤處理,非常不靈活,於是想到了一下的goto:
View Code代碼冗余是解決了,但是引入了C語言中比較微妙的goto語句,雖然正確的使用goto語句可以大大提高程序的靈活性與簡潔性,但是會使我們的程序捉摸不定,為了既避免使用goto語句,又能消除代碼冗余,可以考慮使用下面的 do...while(0):
View Code在linux內核源代碼中,經常看到如下宏以避免在編譯時出現警告:
FOO do { } while(0)
你可能經常會使用如下的宏:
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 {\ ===()
假如一個宏包含類似如下幾行代碼:
FOO(x) \
現在想像一下下面的代碼:
(blah ==
(blah ==
(blah == ();
FOO(x) do { \ ()