亚洲精品久久久久久久久久久,亚洲国产精品一区二区制服,亚洲精品午夜精品,国产成人精品综合在线观看,最近2019中文字幕一页二页

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

1. 函數(shù)宏介紹

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

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

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

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

因此,在工程中,一般使用三種方式來(lái)對(duì)函數(shù)宏進(jìn)行封裝,分別為 {}、do{。..}while(0) 和 ({})。下文將一一對(duì)三種方式進(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)用與在無(wú)花括號(hào)的控制語(yǔ)句(如 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)無(wú)花括號(hào)的 if 語(yǔ)句存在其他分支(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)然沒(méi)有找到與之匹配的 if 了。

因此,解決方法有兩種,分別為不使用 ;(port.1)或規(guī)定必須使用帶花括號(hào)的 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”);}

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

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

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

缺點(diǎn):不能在無(wú)花括號(hào)且有分支的 if 語(yǔ)句中直接調(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)的語(yǔ)句,表象來(lái)說(shuō)與 {} 的功能是一致的。不同的是,do{。..}while(0) 可以提前退出函數(shù)宏、整合為一條語(yǔ)句與強(qiáng)制調(diào)用時(shí)必須使用 ;。

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

#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í)際為一種語(yǔ)法,編譯器會(huì)把 do{。..}while(0); 認(rèn)為為一條語(yǔ)句。

因此,do{。..}while(0) 方式的函數(shù)宏可以在無(wú)花括號(hào)且有分支的 if 語(yǔ)句中直接調(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 語(yǔ)言規(guī)定,do{。..}while(0) 語(yǔ)法必須使用 ; 作為語(yǔ)句結(jié)尾。因此不可能存在以下語(yǔ)句的程序出現(xiàn):

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

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

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

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

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

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

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

與 do{。..}while(0) 相同,({}) 支持在無(wú)花括號(hào)且有分支的 if 語(yǔ)句中直接調(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 語(yǔ)言規(guī)定 ({}) 中的最后一條語(yǔ)句的結(jié)果為該雙括號(hào)體的返回值。例如:

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;}

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

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

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

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

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)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 編程
    +關(guān)注

    關(guān)注

    89

    文章

    3706

    瀏覽量

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

    關(guān)注

    3

    文章

    4404

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(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)三種,它們?cè)谥苿?dòng)原理、應(yīng)用場(chǎng)景及技術(shù)特點(diǎn)上
    的頭像 發(fā)表于 09-19 18:26 ?849次閱讀
    伺服電機(jī)的<b class='flag-5'>三種</b>制動(dòng)<b class='flag-5'>方式</b>有什么區(qū)別?

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

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

    MEMS中的三種測(cè)溫方式

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

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

    1553B總線作為航空電子系統(tǒng)中的關(guān)鍵通信協(xié)議,其組網(wǎng)方式直接影響系統(tǒng)的可靠性和實(shí)時(shí)性。本文將深入解析1553B總線的三種典型組網(wǎng)結(jié)構(gòu):?jiǎn)慰偩€結(jié)構(gòu)、雙冗余總線和多總線分層架構(gòu),并結(jié)合實(shí)際應(yīng)用場(chǎng)景分析
    的頭像 發(fā)表于 06-21 17:39 ?1065次閱讀
    1553B總線常見(jiàn)<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通過(guò)調(diào)整脈沖寬度保持恒定頻率,適用于重負(fù)載,但輕負(fù)載效率低。PFM則在
    發(fā)表于 06-09 16:11

    介紹三種常見(jiàn)的MySQL高可用方案

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

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

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

    redis三種集群方案詳解

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

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

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

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

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

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

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

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

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

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

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

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

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

    三種封裝形式下的400G光模塊概述

    本文主要就三種封裝形式(QSFP-DD、OSFP、QSFP112)的400G光模塊做了簡(jiǎn)單的梳理,從為什么會(huì)有400G光模塊問(wèn)世?400G光模塊在三種封裝形式下的各個(gè)具體型號(hào)(以短距離
    的頭像 發(fā)表于 11-11 11:35 ?1681次閱讀
    <b class='flag-5'>三種</b><b class='flag-5'>封裝</b>形式下的400G光模塊概述