深度理解do{} while(0)语句的作用
生活随笔
收集整理的這篇文章主要介紹了
深度理解do{} while(0)语句的作用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?深度理解do{} while(0)
在linux內核中常常會看到do{} while(0)這樣的語句,有人疑惑,認為無意義,因為他只執行一次,加不加do{} while(0)小過失完全一樣的,那你就錯了,沒有完全了解do{} while(0)。下面看一個例子:
定義一個宏:
#define SAFE_FREE(p) ?do{free(p); p=NULL} ?while(0)假設這里去掉do{....} while(0),及定義為:
#define SAFE_FREE(p) ?free(p); p=NULL;那么一下代碼
If(NULL!=p)SAFE_FREE(p)else.......會被展開成:
If(NULL!=p)free(p); p=NULL;else.......展開存在兩個問題:
如何解決以上問題呢?
有人說給SAFE_FREE的定義加上{}就可以解決上述問題了,即:
#define SAFE_FREE(p) ?{ free(p); p=NULL; }代碼展開如下:If(NULL!=p){ free(p); p=NULL; }else.......但是,在C程序中,每個語句后面加分號是一種約定俗成的習慣,那么代碼如下:
If(NULL!=p){ free(p); p=NULL; };else.......問題又來了,這樣else又沒有對應的if了,編譯還是失敗。假設用了do{} while(0)就可以解決上面的一系列問題了,代碼如下:
If(NULL!=p)do { free(p); p=NULL; } while(0);else.......所以do {} while(0)的使用時為了保證宏定義的使用者能無編譯錯誤的用宏。
總結
以上是生活随笔為你收集整理的深度理解do{} while(0)语句的作用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 类的构造函数和析构函数详解
- 下一篇: strcpy函数的使用