在一些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-