色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

C語言-宏定義中使用do{...} while(0)到底圖個啥

嵌入式那些事 ? 來源:嵌入式那些事 ? 2023-06-11 10:59 ? 次閱讀

Linux 內核中,經常會看到do{} while(0)這樣的語句,許多人開始都會疑惑,認為do{} while(0)毫無意義,因為它只會執行一次,加不加do{} while(0)效果是完全一樣的,其實do {}while(0)的用法主要用于宏定義中。

這里用一個簡單的宏來演示:

#defineSAFE_FREE(p)do{free(p);p=NULL;}while(0)

假設這里去掉do...while(0),即定義SAFE_DELETE為:

#defineSAFE_FREE(p)free(p);p=NULL;

那么以下代碼:

if(NULL!=p)
SAFE_DELETE(p)
else
.../*dosomething*/

會被展開為:

if(NULL!=p)
free(p);p=NULL;
else
.../*dosomething*/

展開的代碼中存在兩個問題。

(1)、因為 if 分支后有兩個語句,導致 else 分支沒有對應的 if,編譯失敗。

(2)、假設沒有 else 分支,則 SAFE_FREE 中的第二個語句無論 if 測試是否通過,都會執行。

的確,將SAFE_FREE的定義加上{}就可以解決上述問題了,即:

#defineSAFE_FREE(p){free(p);p=NULL;}

這樣,代碼:

if(NULL!=p)
SAFE_DELETE(p)
else
.../*dosomething*/

會被展開為:

if(NULL!=p)
{free(p);p=NULL;}
else
.../*dosomething*/

但是,在 C 程序中,每個語句后面加分號是一種約定俗成的習慣,那么,如下代碼:

if(NULL!=p)
SAFE_DELETE(p);
else
.../*dosomething*/

將被擴展為:

if(NULL!=p)
{free(p);p=NULL;};
else
.../*dosomething*/

這樣,else 分支就又沒有對應的 if 了,編譯將無法通過。假設用了do {} while(0),情況就不一樣了,同樣的代碼會被展開為:

if(NULL!=p)
do{free(p);p=NULL;}while(0);
else
.../*dosomething*/

不會再出現編譯問題。do while(0)的使用完全是為了保證宏定義的使用者能在不出現編譯錯誤的情況下使用宏,它不對其使用者做任何假設。





審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • C語言
    +關注

    關注

    180

    文章

    7604

    瀏覽量

    136692
  • LINUX內核
    +關注

    關注

    1

    文章

    316

    瀏覽量

    21644

原文標題:C語言-宏定義中使用do {...} while(0)到底圖個啥

文章出處:【微信號:嵌入式那些事,微信公眾號:嵌入式那些事】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    C語言定義使用技巧

    寫好C語言,漂亮的定義很重要,使用定義可以防止出錯,提高可移植性,可讀性,方便性等等。下面列
    發表于 07-29 09:35 ?1112次閱讀

    C語言中常用的定義

    寫好C語言,漂亮的定義很重要,使用定義可以防止出錯,提高可移植性,可讀性,方便性等等。下面列
    發表于 10-18 10:05 ?1674次閱讀

    C語言定義的應用

    C語言中,定義是一種預處理指令,用于在代碼中定義和使用常量、函數或代碼片段的替代。
    發表于 08-17 15:33 ?804次閱讀

    C語言whiledo-while循環的用法

    循環是一種重要的控制結構,可以使程序重復執行一段代碼,直到滿足特定條件為止。在C語言中,whiledo-while是兩種常用的循環結構,本文將詳細介紹這兩種循環的用法。
    發表于 08-18 16:35 ?1832次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>中<b class='flag-5'>while</b>和<b class='flag-5'>do-while</b>循環的用法

    C語言定義中#和##的作用

    ,format,args...) \do{printf("[%s]",#level);printf(format,##args);}while(0)SLOG(ERR,"
    發表于 08-23 18:22

    C語言定義使用do{}while(0)的好處是什么

    C語言定義使用do{}while(0)的好處1.
    發表于 02-25 06:28

    C語言定義使用技巧

    寫好C語言,漂亮的定義很重要,使用定義可以防止出錯,提高可移植性,可讀性,方便性 等等。下面
    發表于 11-13 12:04 ?36次下載

    C++語言基礎講解視頻do while循環語句

    C++語言基礎講解視頻do while循環語句
    發表于 01-14 15:32 ?5次下載

    HAL庫中do{...} while(0U) 定義的作用和意義

    HAL庫中do{...} while(0U)定義的作用和意義
    的頭像 發表于 03-03 14:07 ?3415次閱讀

    do{...} while(0U) 這種代碼的作用和意義

    的朋友都知道,源碼里面有許多do{...} while(0U)的定義語句。 ? 今天講的主要知識點是:HAL庫中
    的頭像 發表于 06-04 14:00 ?2766次閱讀
    <b class='flag-5'>do</b>{...} <b class='flag-5'>while</b>(<b class='flag-5'>0</b>U) 這種代碼的作用和意義

    C語言基礎:定義使用do{}while(0)的好處

    C語言定義使用do{}while(0)的好處1.
    發表于 01-13 13:06 ?2次下載
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>基礎:<b class='flag-5'>宏</b><b class='flag-5'>定義</b>使用<b class='flag-5'>do</b>{}<b class='flag-5'>while</b>(<b class='flag-5'>0</b>)的好處

    C程序中do{}while(0)定義的作用

    在嵌入式開發中,定義非常強大也非常便捷,如果正確使用可以讓你的工作事半功倍。然而,在很多的C程序中,你可能會看到不是那么直接的比較特殊一點的定義
    的頭像 發表于 05-23 12:44 ?2874次閱讀

    c語言定義可以嵌套嗎?

    c語言定義可以嵌套嗎? C語言
    的頭像 發表于 09-04 17:38 ?3172次閱讀

    c語言帶參數的定義

    c語言帶參數的定義? C語言
    的頭像 發表于 09-04 17:45 ?2403次閱讀

    do{}while(0)只執行一次有意義嗎?

    在嵌入式開發中,定義非常強大也非常便捷,如果正確使用可以讓你的工作事半功倍。然而,在很多的C程序中,你可能會看到不是那么直接的比較特殊一點的定義
    的頭像 發表于 10-09 14:20 ?698次閱讀
    <b class='flag-5'>do</b>{}<b class='flag-5'>while</b>(<b class='flag-5'>0</b>)只執行一次有意義嗎?
    主站蜘蛛池模板: 金瓶梅 快播| 99热6精品视频6| 午夜亚洲WWW湿好爽| 碰超成人在线公开免费视频| 老师那里好大又粗h男男| 黑人操白逼| 国产野外无码理论片在线观看| 儿媳妇完整版视频播放免费观看| 999视频在线观看| 13一18TV处流血TV| 24小时日本免费看| 5g天天奭视频| 99re2.久久热最新地址| 99re6久久热在线播放| 97色伦图片97色伦图影院久久| 2021国产精品| 99国产强伦姧在线看RAPE| 69ZXX少妇内射无码| 4虎最新网址| 99视频免费观看| 被爽到叫呻呤视频免费视频| 仓井空torrent| 成人小视频在线观看| 国产99小视频| 国产伦精品一区二区免费| 国产女人喷潮视频免费| 韩国羞羞秘密教学子开车漫书 | 日本另类z0zxhd| 日本人69xxx| 特级毛片全部免费播放免下载| 校园女教师之禁区| 亚洲男同tv| 最近中文字幕MV高清在线视频| 最新精品国产| youjizz护士| 国产第一页浮力影院| 国产一区二区波多野结衣| 久久国产主播福利在线| 嗯啊不要老师| 色欲久久综合亚洲精品蜜桃| 亚洲AV无码影院在线播放|