在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

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

Linux 內(nèi)核中,經(jīng)常會(huì)看到do{} while(0)這樣的語句,許多人開始都會(huì)疑惑,認(rèn)為do{} while(0)毫無意義,因?yàn)樗粫?huì)執(zhí)行一次,加不加do{} while(0)效果是完全一樣的,其實(shí)do {}while(0)的用法主要用于宏定義中。

這里用一個(gè)簡(jiǎn)單的宏來演示:

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

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

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

那么以下代碼:

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

會(huì)被展開為:

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

展開的代碼中存在兩個(gè)問題。

(1)、因?yàn)?if 分支后有兩個(gè)語句,導(dǎo)致 else 分支沒有對(duì)應(yīng)的 if,編譯失敗。

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

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

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

這樣,代碼:

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

會(huì)被展開為:

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

但是,在 C 程序中,每個(gè)語句后面加分號(hào)是一種約定俗成的習(xí)慣,那么,如下代碼:

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

將被擴(kuò)展為:

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

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

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

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





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7614

    瀏覽量

    137408
  • LINUX內(nèi)核
    +關(guān)注

    關(guān)注

    1

    文章

    316

    瀏覽量

    21700

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

文章出處:【微信號(hào):嵌入式那些事,微信公眾號(hào):嵌入式那些事】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    C語言定義使用技巧

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

    C語言中常用的定義

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

    C語言定義的應(yīng)用

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

    C語言whiledo-while循環(huán)的用法

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

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

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

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

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

    C語言定義使用技巧

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

    C++語言基礎(chǔ)講解視頻do while循環(huán)語句

    C++語言基礎(chǔ)講解視頻do while循環(huán)語句
    發(fā)表于 01-14 15:32 ?5次下載

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

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

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

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

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

    C語言定義使用do{}while(0)的好處1.
    發(fā)表于 01-13 13:06 ?2次下載
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>基礎(chǔ):<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)定義的作用

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

    c語言定義可以嵌套嗎?

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

    c語言帶參數(shù)的定義

    c語言帶參數(shù)的定義? C語言
    的頭像 發(fā)表于 09-04 17:45 ?2477次閱讀

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

    在嵌入式開發(fā)中,定義非常強(qiáng)大也非常便捷,如果正確使用可以讓你的工作事半功倍。然而,在很多的C程序中,你可能會(huì)看到不是那么直接的比較特殊一點(diǎn)的定義
    的頭像 發(fā)表于 10-09 14:20 ?781次閱讀
    <b class='flag-5'>do</b>{}<b class='flag-5'>while</b>(<b class='flag-5'>0</b>)只執(zhí)行一次有意義嗎?
    主站蜘蛛池模板: 九九热九九 | 不卡精品国产_亚洲人成在线 | 欧美精彩狠狠色丁香婷婷 | 丁香六月激情网 | 黄色毛片大全 | 视频一本大道香蕉久在线播放 | 男人女人真曰批视频播放 | 在线中文天堂 | 亚洲天堂婷婷 | 97精品久久天干天天蜜 | 亚洲第一视频在线播放 | 乱码一区二区三区完整视频 | 欧美一区二区高清 | 国产亚洲卡二卡3卡4卡乱码 | 丁香六月啪| 日本5级床片全免费 | 深夜视频免费看 | 黄 色 免 费 网站在线观看 | 免费一级特黄a | 欧美深夜| 免费一级片在线 | 国产全肉乱妇杂乱视频 | 天天色操| 黄视频在线免费看 | 特级全黄大片 | 成年ssswww日本 | 色狠狠网| 天堂最新在线资源 | 五月婷婷久 | 天天射天天射天天射 | 日本最猛黑人xxxx猛交 | 国产欧美视频在线 | 综合五月激情 | 香蕉视频黄色片 | 美女视频一区二区三区在线 | 亚洲精品美女久久久久网站 | 女性一级全黄生活片免费看 | 亚洲国内精品久久 | 亚洲性人人天天夜夜摸 | 在线成人aa在线看片 | 十三以下岁女子毛片免费播放 |