do {...} while (0) 的用途彙總(歡迎補充)
在一些Linux核心和其它的開原始碼中,我們經常看到像下面這樣的程式碼:
do{ ... }while(0)
該程式碼片段並非迴圈,這樣想想似乎使用do…while沒有任何意義,那麼為什麼還要使用它呢?
實際上,do{...}while(0)的用途並不僅僅是優化你的程式碼。經過一系列的調研和探索,我們總結出它的一些用途如下。
1. 幫助定義複雜的巨集以避免錯誤
詳細解釋請看“do {...} while (0) 在巨集定義中的作用 ”,講述瞭如何利用do {...} while (0) 解決常犯的巨集定義錯誤,讓大家不再懼怕巨集。
2. 避免使用goto控制程式流
在一些函式中,我們在return語句之前可能需要做一些工作,比如釋放在函式一開始由malloc函式申請的記憶體空間,使用goto總是一種簡單的方法:
int foo() { somestruct* ptr = malloc(...); dosomething...; if(error) { goto END; } dosomething...; if(error) { goto END; } dosomething...; END: free(ptr); return 0; }
但由於goto關鍵字可能會使程式碼不易讀,因此許多人都不推薦使用它,那麼我們可以使用do{...}while(0)來解決這一問題:
int foo() { somestruct* ptr = malloc(...); do{ dosomething...; if(error) { break; } dosomething...; if(error) { break; } dosomething...; }while(0); free(ptr); return 0; }
這裡,我們使用do{...}while(0)來包含函式的主要部分,同時使用break替換goto,程式碼的可讀性增強了。
3. 避免由巨集引起的警告
由於核心不同體系結構的限制,我們可能需要多次使用空巨集。在編譯的時候,這些空巨集會產生警告,為了避免這種警告,我們可以使用do{...}while(0)來定義空巨集:
#define EMPTYMICRO do{}while(0)
這樣在編譯的時候就不會產生警告。
4. 定義單一的函式塊來完成複雜的操作
如果你有一個複雜的函式且你不想要建立新的函式,那麼使用do{...}while(0),你可以將一些程式碼放在這裡面並定義一些變數,這樣你就不必擔心do{...}while(0)外面的變數名是否與do{...}while(0)裡面的變數名相同造成重複了。
如果你發現do{...}while(0)其它的好用途,請與我們分享哦!
編譯自:http://www.pixelstech.net/article/1350871981-Significance-and-use-of-do%7B-%7Dwhile%280%29-