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-


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM