1. 程式人生 > >do {...} while (0) 的用途彙總(歡迎補充)

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-