chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

函數(shù)宏的三種封裝方式

璟琰乀 ? 來源:大魚機(jī)器人 ? 作者:大魚機(jī)器人 ? 2020-12-22 15:49 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1. 函數(shù)宏介紹

函數(shù)宏,即包含多條語句的宏定義,其通常為某一被頻繁調(diào)用的功能的語句封裝,且不想通過函數(shù)方式封裝來降低額外的彈棧壓棧開銷。

函數(shù)宏本質(zhì)上為宏,可以直接進(jìn)行定義,例如:

#define INT_SWAP(a,b) \ int tmp = a; \ a = b; \ b = tmp

但上述的宏具有一個(gè)明顯的缺點(diǎn):當(dāng)遇到 if、while 等語句且不使用花括號僅調(diào)用宏時(shí),實(shí)際作用范圍在宏的第一個(gè)分號后便結(jié)束。即 a = b 和 b = tmp 均不受控制語句所作用。

因此,在工程中,一般使用三種方式來對函數(shù)宏進(jìn)行封裝,分別為 {}、do{。..}while(0) 和 ({})。下文將一一對三種方式進(jìn)行分析,比較各自的優(yōu)劣點(diǎn)。

2. {} 方式

INT_SWAP 宏使用 {} 封裝后形態(tài)如下:

#define INT_SWAP(a,b)\{ \ int tmp = a; \ a = b; \ b = tmp; \}

此時(shí),直接調(diào)用與在無花括號的控制語句(如 if、while)中調(diào)用均能正常運(yùn)行,例如:

#define INT_SWAP(a,b) \{ \ int tmp = a; \ a = b; \ b = tmp; \}int main(){ int var_a = 1; int var_b = 2; INT_SWAP(var_a, var_b); printf(“var_a = %d, var_b = %d\n”, var_a, var_b); // var_a = 2, var_b = 1 if (1) INT_SWAP(var_a, var_b); printf(“var_a = %d, var_b = %d\n”, var_a, var_b); // var_a = 1, var_b = 2}

但當(dāng)無花括號的 if 語句存在其他分支(else if、else 等)如:

if (1) INT_SWAP(var_a, var_b);else printf(“hello world!\n”);

會(huì)發(fā)現(xiàn)編譯出錯(cuò):

。../mnt/hgfs/share/pr_c/src/main.c: In function ‘main’:/mnt/hgfs/share/pr_c/src/main.c:18:2: error: ‘else’ without a previous ‘if’ else

這是因?yàn)?INT_SWAP(var_a, var_b); 最后的 ; 已經(jīng)把 if 的作用域終結(jié)了,后續(xù)的 else 當(dāng)然沒有找到與之匹配的 if 了。

因此,解決方法有兩種,分別為不使用 ;(port.1)或規(guī)定必須使用帶花括號的 if(port.2),例如:

/* port.1 */if (1) INT_SWAP(var_a, var_b)else{ printf(“hello world!\n”);}/* port.2 */if (1){ INT_SWAP(var_a, var_b);}else{ printf(“hello world!\n”);}

可見,不使用 ; 的調(diào)用方式無論從程序閱讀還是使用方法方面都是十分別扭的;而規(guī)定必須使用帶花括號的 if 的調(diào)用方式有違常理的,因?yàn)楹旰瘮?shù)應(yīng)該適用于任何語法。

優(yōu)缺點(diǎn)總結(jié):

優(yōu)點(diǎn):簡單粗暴。

缺點(diǎn):不能在無花括號且有分支的 if 語句中直接調(diào)用;能夠不帶 ; 直接調(diào)用。

3. do{。..}while(0) 方式INT_SWAP 宏使用 do{。..}while(0) 封裝后形態(tài)如下:

#define INT_SWAP(a,b) \do{ \ int tmp = a; \ a = b; \ b = tmp; \}while(0)

do{。..}while(0) 表示只執(zhí)行一遍 {} 內(nèi)的語句,表象來說與 {} 的功能是一致的。不同的是,do{。..}while(0) 可以提前退出函數(shù)宏、整合為一條語句與強(qiáng)制調(diào)用時(shí)必須使用 ;。

由于 do{。..}while(0) 實(shí)際為 while 循環(huán),因此可以使用關(guān)鍵字 break 提前結(jié)束循環(huán)。利用該特性,可以為函數(shù)宏添加參數(shù)檢測。例如:

#define INT_SWAP(a,b) \do{ \ if (a 《 0 || b 《 0) \ break; \ int tmp = a; \ a = b; \ b = tmp; \}while(0)

由于 do{。..}while(0); 實(shí)際為一種語法,編譯器會(huì)把 do{。..}while(0); 認(rèn)為為一條語句。

因此,do{。..}while(0) 方式的函數(shù)宏可以在無花括號且有分支的 if 語句中直接調(diào)用。例如:

#define INT_SWAP(a,b) \do{ \ if (a 《 0 || b 《 0) \ break; \ int tmp = a; \ a = b; \ b = tmp; \}while(0)int main(){ int var_a = 1; int var_b = 2; if (1) INT_SWAP(var_a, var_b); else printf(“hello world!\n”); printf(“var_a = %d, var_b = %d\n”, var_a, var_b); // var_a = 2, var_b = 1 return 0;}

C 語言規(guī)定,do{。..}while(0) 語法必須使用 ; 作為語句結(jié)尾。因此不可能存在以下語句的程序出現(xiàn):

if (1) INT_SWAP(var_a, var_b)else{ printf(“hello world!\n”); }

優(yōu)缺點(diǎn)總結(jié):

優(yōu)點(diǎn):支持在無花括號且有分支的 if 語句中直接調(diào)用;支持提前退出函數(shù)宏;強(qiáng)制調(diào)用時(shí)必須使用 ;。

缺點(diǎn):無返回值,不能作為表達(dá)式的右值使用。

4. ({}) 方式({}) 為 GNU C 擴(kuò)展的語法,非 C 語言的原生語法。

INT_SWAP 宏使用 ({}) 封裝后形態(tài)如下:

#define INT_SWAP(a,b) \({ \ int tmp = a; \ a = b; \ b = tmp; \})

與 do{。..}while(0) 相同,({}) 支持在無花括號且有分支的 if 語句中直接調(diào)用。例如:

#define INT_SWAP(a,b) \({ \ int tmp = a; \ a = b; \ b = tmp; \})int main(){ int var_a = 1; int var_b = 2; if (1) INT_SWAP(var_a, var_b); else printf(“hello world!\n”); printf(“var_a = %d, var_b = %d\n”, var_a, var_b); // var_a = 2, var_b = 1 return 0;}

與 do{。..}while(0) 不同的是,({}) 不能提前退出函數(shù)宏與支持返回值。({}) 畢竟不是 while 循環(huán),不能直接使用 break退出函數(shù)宏是比較容易理解。那支持返回值是什么意思呢?

答案是 C 語言規(guī)定 ({}) 中的最后一條語句的結(jié)果為該雙括號體的返回值。例如:

int main(){ int a = ({ 10; 1000; }); printf(“a = %d\n”, a); // a = 1000}

因此,({}) 可以為函數(shù)宏提供返回值。例如:

#define INT_SWAP(a,b) \({ \ int ret = 0; \ if (a 《 0 || b 《 0) \ { \ ret = -1; \ } \ else \ { \ int tmp = a; \ a = b; \ b = tmp; \ } \ ret; \})int main(){ int var_a = 1; int var_b = 2; if (INT_SWAP(var_a, var_b) != -1) printf(“swap success ??!\n”); // swap success ?。?else printf(“swap fail ??!\n”); printf(“var_a = %d, var_b = %d\n”, var_a, var_b); // var_a = 2, var_b = 1 return 0;}

可見,此時(shí)的 INT_SWAP 宏已與函數(shù)十分接近。

優(yōu)缺點(diǎn)總結(jié):

優(yōu)點(diǎn):支持在無花括號且有分支的 if 語句中直接調(diào)用;有返回值,支持作為表達(dá)式的右值。

缺點(diǎn):不支持提前退出函數(shù)宏;非 C 的原生語法,編譯器可能不支持。

5. 總結(jié)綜上,在 {}、do{。..}while(0) 和 ({}) 這三種函數(shù)宏的封裝方式之中,應(yīng)盡可能不使用 {},考慮兼容性一般選擇使用 do{。..}while(0),當(dāng)需要函數(shù)宏返回時(shí)可以考慮使用 ({}) 或直接定義函數(shù)。

責(zé)任編輯:haq

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

    關(guān)注

    90

    文章

    3707

    瀏覽量

    96709
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4405

    瀏覽量

    66791
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    伺服電機(jī)的三種制動(dòng)方式有什么區(qū)別?

    伺服電機(jī)作為自動(dòng)化控制系統(tǒng)中執(zhí)行元件的核心部件,其制動(dòng)性能直接影響設(shè)備的定位精度和安全可靠性。目前主流的伺服電機(jī)制動(dòng)方式包括動(dòng)態(tài)制動(dòng)、再生制動(dòng)和電磁機(jī)械制動(dòng)三種,它們在制動(dòng)原理、應(yīng)用場景及技術(shù)特點(diǎn)上
    的頭像 發(fā)表于 09-19 18:26 ?1087次閱讀
    伺服電機(jī)的<b class='flag-5'>三種</b>制動(dòng)<b class='flag-5'>方式</b>有什么區(qū)別?

    C語言中的內(nèi)聯(lián)函數(shù)

    在C編程中,內(nèi)聯(lián)函數(shù)都用于避免函數(shù)調(diào)用的開銷并編寫可復(fù)用的邏輯部分,但它們在工作方式和安全性方面存在顯著差異。
    的頭像 發(fā)表于 07-25 15:10 ?1700次閱讀
    C語言中的內(nèi)聯(lián)<b class='flag-5'>函數(shù)</b>與<b class='flag-5'>宏</b>

    MEMS中的三種測溫方式

    在集成MEMS芯片的環(huán)境溫度測量領(lǐng)域,熱阻、熱電堆和PN結(jié)原理是三種主流技術(shù)。熱阻是利用熱敏電阻,如金屬鉑或注入硅的溫度電阻系數(shù)恒定,即電阻隨溫度線性變化的特性測溫,電阻變化直接對應(yīng)絕對溫度,需恒流源供電。
    的頭像 發(fā)表于 07-16 13:58 ?1268次閱讀
    MEMS中的<b class='flag-5'>三種</b>測溫<b class='flag-5'>方式</b>

    1553B總線常見三種組網(wǎng)方式

    1553B總線作為航空電子系統(tǒng)中的關(guān)鍵通信協(xié)議,其組網(wǎng)方式直接影響系統(tǒng)的可靠性和實(shí)時(shí)性。本文將深入解析1553B總線的三種典型組網(wǎng)結(jié)構(gòu):單總線結(jié)構(gòu)、雙冗余總線和多總線分層架構(gòu),并結(jié)合實(shí)際應(yīng)用場景分析
    的頭像 發(fā)表于 06-21 17:39 ?1255次閱讀
    1553B總線常見<b class='flag-5'>三種</b>組網(wǎng)<b class='flag-5'>方式</b>

    開關(guān)電源三種控制模式:PWM/PFM/PSM

    摘要 本文詳細(xì)介紹了開關(guān)電源的三種主要調(diào)制方式:PWM(脈沖寬度調(diào)制)、PFM(脈沖頻率調(diào)制)和PSM(脈沖跨周期調(diào)制)。PWM通過調(diào)整脈沖寬度保持恒定頻率,適用于重負(fù)載,但輕負(fù)載效率低。PFM則在
    發(fā)表于 06-09 16:11

    介紹三種常見的MySQL高可用方案

    在生產(chǎn)環(huán)境中,為了確保數(shù)據(jù)庫系統(tǒng)的連續(xù)可用性、降低故障恢復(fù)時(shí)間以及實(shí)現(xiàn)業(yè)務(wù)的無縫切換,高可用(High Availability, HA)方案至關(guān)重要。本文將詳細(xì)介紹三種常見的 MySQL 高可用
    的頭像 發(fā)表于 05-28 17:16 ?983次閱讀

    信號隔離器三種供電方式的區(qū)別

    信號隔離器是一重要的信號隔離裝置,其供電方式主要有獨(dú)立供電、回路供電和輸出回路供電三種。以下是這三種供電方式的詳細(xì)區(qū)別: 一、獨(dú)立供電 1
    的頭像 發(fā)表于 04-17 16:23 ?1046次閱讀
    信號隔離器<b class='flag-5'>三種</b>供電<b class='flag-5'>方式</b>的區(qū)別

    redis三種集群方案詳解

    在Redis中提供的集群方案總共有三種(一般一個(gè)redis節(jié)點(diǎn)不超過10G內(nèi)存)。
    的頭像 發(fā)表于 03-31 10:46 ?1254次閱讀
    redis<b class='flag-5'>三種</b>集群方案詳解

    GaN、超級SI、SiC這三種MOS器件的用途區(qū)別

    如果想要說明白GaN、超級SI、SiC這三種MOS器件的用途區(qū)別,首先要做的是搞清楚這三種功率器件的特性,然后再根據(jù)材料特性分析具體應(yīng)用。
    的頭像 發(fā)表于 03-14 18:05 ?2126次閱讀

    FOC中的三種電流采樣方式,你真的會(huì)選擇嗎?(可下載)

    的基礎(chǔ),用一句話來形容就是“基礎(chǔ)不對,努力白費(fèi)”,由此可見電流采樣在整 個(gè) FOC 算法中的作用電流采樣的方式一般分為電阻、雙電阻、單電阻,這三種采樣方式都有其
    發(fā)表于 03-12 15:04 ?3次下載

    紅外探測器晶圓級、陶瓷級和金屬級三種封裝形式有什么區(qū)別?

    紅外探測器作為紅外熱像儀的核心部件,廣泛應(yīng)用于工業(yè)、安防、醫(yī)療等多個(gè)領(lǐng)域。隨著技術(shù)的不斷進(jìn)步,紅外探測器的封裝形式也在不斷發(fā)展和完善。其中,晶圓級、陶瓷級和金屬級封裝三種最常見的封裝
    的頭像 發(fā)表于 03-05 16:43 ?1000次閱讀
    紅外探測器晶圓級、陶瓷級和金屬級<b class='flag-5'>三種</b><b class='flag-5'>封裝</b>形式有什么區(qū)別?

    深入解析三種鋰電池封裝形狀背后的技術(shù)路線與工藝奧秘

    在新能源時(shí)代,鋰電池作為核心動(dòng)力與儲(chǔ)能單元,其重要性不言而喻。而在鋰電池的諸多特性中,封裝形狀這一外在表現(xiàn)形式,實(shí)則蘊(yùn)含著復(fù)雜的技術(shù)考量與工藝邏輯。方形、圓柱、軟包三種主流封裝形狀,各自對應(yīng)著獨(dú)特
    的頭像 發(fā)表于 02-17 10:10 ?1983次閱讀
    深入解析<b class='flag-5'>三種</b>鋰電池<b class='flag-5'>封裝</b>形狀背后的技術(shù)路線與工藝奧秘

    三種太赫茲波的產(chǎn)生方式

    本文簡單介紹了三種太赫茲波的產(chǎn)生方式。 太赫茲波(THz)是一電磁波,在電磁波譜上位于紅外與微波之間。太赫茲光子能量在1-10 meV范圍之間,在光譜分析、醫(yī)療成像、移動(dòng)通信方面都有非常廣闊
    的頭像 發(fā)表于 02-17 09:09 ?3426次閱讀
    <b class='flag-5'>三種</b>太赫茲波的產(chǎn)生<b class='flag-5'>方式</b>

    示波器的三種觸發(fā)模式

    示波器的觸發(fā)方式不僅影響波形捕捉的時(shí)機(jī),還決定了顯示的波形是否穩(wěn)定。 常見的觸發(fā)模式有三種: 單次觸發(fā) (Single)、 正常觸發(fā) (Normal)和 自動(dòng)觸發(fā) (Auto)。下面將對這三種觸發(fā)
    的頭像 發(fā)表于 01-07 11:04 ?1.3w次閱讀
    示波器的<b class='flag-5'>三種</b>觸發(fā)模式

    電子封裝三種形式

    ? 電子封裝材料作為連接芯片與外部世界的橋梁,其重要性不言而喻。合格的封裝不僅能夠?yàn)樾酒峁┪锢肀Wo(hù),實(shí)現(xiàn)標(biāo)準(zhǔn)規(guī)格化的互連,更是確保電子產(chǎn)品性能穩(wěn)定、延長使用壽命的關(guān)鍵。 一、塑料封裝 塑料
    的頭像 發(fā)表于 12-06 11:05 ?1753次閱讀