日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

深度理解do{} while(0)语句的作用

發布時間:2025/6/15 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深度理解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.......

展開存在兩個問題:

  • 因為if分支后面有兩個語句,導致else分支沒有對應的if,編譯失敗。
  • 假設沒有else分支,則SAFE_FREE中的第二個語句無論if測試是否通過,都會執行。
  • 如何解決以上問題呢?

    有人說給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)语句的作用的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。