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

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

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

宏和函數(shù)應(yīng)該怎么選

麥辣雞腿堡 ? 來(lái)源:軒哥談芯 ? 作者:軒哥談芯 ? 2023-11-01 17:35 ? 次閱讀

今天我們來(lái)看一下利用宏定義編寫類似函數(shù)調(diào)用的方法和真實(shí)的函數(shù)有什么區(qū)別。

一、宏和函數(shù)怎么選?

首先來(lái)看一個(gè)例子:

#define N 2+2
void main()
{    
    int a = N * N;    
    printf( "a = %d", a);
}

這里,我們得理解宏的工作方式,它是在編譯器編譯代碼之前做的一個(gè)純文本的替換工作,因此,有時(shí)候簡(jiǎn)單宏替換的結(jié)果就會(huì)和我們預(yù)想的結(jié)果出現(xiàn)偏差。

比如上面的例子,我們預(yù)期 N 為 4,a=16,但實(shí)際結(jié)果卻為 a=8;原因在于宏的作用方式是傻瓜式的文本替換。

在編譯之前,編譯器首先將宏定義的文本替換到程序體中,這個(gè)替換是完全無(wú)腦的一個(gè)操作,看一下替換結(jié)果就知道了。

#define N 2+2
void main()
{    
    int a = 2 + 2 * 2 + 2;    
    printf( "a = %d", a);
}

這也就是我們上一篇文章中講到的,寫宏函數(shù)的時(shí)候一定要注意括號(hào)的應(yīng)用,多加括號(hào)一定是利大于弊的。

聲明:本文內(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)投訴
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4355

    瀏覽量

    63318
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4858

    瀏覽量

    69550
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1645

    瀏覽量

    49472
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    LED戶外顯示屏應(yīng)該什么樣的比較好呢?

    戶外LED顯示屏應(yīng)該什么樣的比較好呢?LED電子大屏幕是科技與媒體的完美結(jié)合,它能把夢(mèng)幻、科技、潮流、時(shí)尚的理念淋淋盡致地展現(xiàn)出來(lái), 完全可以當(dāng)仁不讓地成為舞美新勢(shì)力新的室內(nèi)大型LED屏幕
    的頭像 發(fā)表于 02-13 14:58 ?189次閱讀
    LED戶外顯示屏<b class='flag-5'>應(yīng)該</b><b class='flag-5'>選</b>什么樣的比較好呢?

    是德33220A 函數(shù)任意波形發(fā)生器

    是德33220A 函數(shù)任意波形發(fā)生器 儀器特性 *33220A 函數(shù)發(fā)生器包括 USB、GPIB 和 LAN 接口 *用于信號(hào)設(shè)置視覺(jué)驗(yàn)證的圖形模式 *件 001 提供支持同步信道的多元鏈路
    的頭像 發(fā)表于 02-07 15:55 ?134次閱讀

    ADS1282沒(méi)有CS片,應(yīng)該怎樣單獨(dú)給DAC傳輸數(shù)據(jù)呢?

    請(qǐng)問(wèn)DAC1282和ADS1282的SCLK、DIN、DOUT可以接到一起,然后分別連接MCU的SCK、SOMI、SIMO嗎? 如果可以的話,ADS1282沒(méi)有CS片應(yīng)該怎樣單獨(dú)給DAC傳輸數(shù)據(jù)呢? 謝謝
    發(fā)表于 11-25 07:35

    SUMIF函數(shù)與SUMIFS函數(shù)的區(qū)別

    SUMIF函數(shù)和SUMIFS函數(shù)都是Excel中用于條件求和的函數(shù),它們可以幫助用戶根據(jù)特定的條件對(duì)數(shù)據(jù)進(jìn)行求和。盡管它們的基本功能相似,但在使用場(chǎng)景和功能上存在一些差異。以下是對(duì)這兩個(gè)函數(shù)
    的頭像 發(fā)表于 10-30 09:51 ?4728次閱讀

    SV中define定義的用法

    SV中使用預(yù)處理指令`define來(lái)定義,可以用來(lái)創(chuàng)建文本替換。根據(jù)場(chǎng)景不同,`define主要用來(lái)定義常量、簡(jiǎn)化復(fù)雜的表達(dá)式或代碼段以及提高代碼的可移植性。其基本語(yǔ)法為:
    的頭像 發(fā)表于 10-21 14:22 ?1096次閱讀

    科技擬收購(gòu)APCB 100%股權(quán)

    科技近期發(fā)布重要公告,宣布其計(jì)劃通過(guò)全資子公司新加坡勝及PSL,以不超過(guò)2.787億元人民幣的現(xiàn)金,全面收購(gòu)APCB Electronics(Thailand)Co.,Ltd.(簡(jiǎn)稱APCB)的100%股權(quán)。此次收購(gòu)標(biāo)志著勝
    的頭像 發(fā)表于 08-12 15:06 ?686次閱讀

    面試???1:函數(shù)指針與指針函數(shù)、數(shù)組指針與指針數(shù)組

    在嵌入式開發(fā)領(lǐng)域,函數(shù)指針、指針函數(shù)、數(shù)組指針和指針數(shù)組是一些非常重要但又容易混淆的概念。理解它們的特性和應(yīng)用場(chǎng)景,對(duì)于提升嵌入式程序的效率和質(zhì)量至關(guān)重要。一、指針函數(shù)函數(shù)指針指針
    的頭像 發(fā)表于 08-10 08:11 ?1069次閱讀
    面試???1:<b class='flag-5'>函數(shù)</b>指針與指針<b class='flag-5'>函數(shù)</b>、數(shù)組指針與指針數(shù)組

    TC387中有__disable_interrupts()關(guān)閉所有中斷和打開所有中斷的函數(shù)嗎?

    TC387 芯片中有__disable_irq()和__enable_irq()關(guān)閉所有中斷和打開所有中斷的函數(shù)嗎,請(qǐng)告知
    發(fā)表于 08-01 08:22

    STM32的外部事件應(yīng)該何如使用?

    知道外部事件是產(chǎn)生中斷標(biāo)志,但是不產(chǎn)生中斷請(qǐng)求。但是在主函數(shù)應(yīng)該怎么檢測(cè)這個(gè)中斷標(biāo)志,或者說(shuō)應(yīng)該怎么配置。在cubemx中,將io口配置為事件模式之后。相對(duì)應(yīng)的中斷線也不高亮了,想問(wèn)一下大佬們,
    發(fā)表于 07-05 08:00

    請(qǐng)問(wèn)怎么在自己的工程里添加一個(gè)INCLUDE_xTaskGetHandle?

    你好: 我需要使用 xTaskGetHandle 這個(gè)API,但是 idf.py menuconfig進(jìn)去freertos組件里沒(méi)有這個(gè)配置選項(xiàng) 我應(yīng)該怎么添加一個(gè)定義到我的cmakelist里??而不是直接改sdk的文件。
    發(fā)表于 06-21 12:39

    webserver獲取網(wǎng)頁(yè)submit應(yīng)該用什么函數(shù)呢?

    各位大神: esp32c3,idfd ubuntu編譯,html轉(zhuǎn)為C放在代碼里,想獲取網(wǎng)頁(yè)的提交按鍵進(jìn)行響應(yīng),請(qǐng)問(wèn)提交“submit”時(shí),C里應(yīng)該對(duì)應(yīng)的是哪個(gè)函數(shù)。本人webserver小白,感謝指教!
    發(fā)表于 06-18 07:18

    Ltc367傳輸6 bytes時(shí),片CS拉低后會(huì)正常傳輸5bytes,然后片cs 時(shí)鐘clk與輸出信號(hào)都不再變化,為什么?

    設(shè)置為shortcontinuous模式,使用illd的spimaster_exchange函數(shù),發(fā)現(xiàn)最多只能傳輸5 bytes。 使用邏輯分析儀,發(fā)現(xiàn)在傳輸6 bytes時(shí),片CS拉低后會(huì)正常傳輸5bytes,然后片cs
    發(fā)表于 05-29 06:19

    PCB板的顏色應(yīng)該怎么?為什么綠色最常見?

    使用的,更為人熟悉。但是不同的PCB我們應(yīng)該怎么去選擇PCB的顏色呢,為什么綠色更常用呢?1綠色PCB板綠色是最常見的PCB顏色,也是最經(jīng)濟(jì)、使用最廣泛的選擇。這是因?yàn)樵趥?/div>
    的頭像 發(fā)表于 05-10 08:20 ?1212次閱讀
    PCB板的顏色<b class='flag-5'>應(yīng)該</b>怎么<b class='flag-5'>選</b>?為什么綠色最常見?

    用hal庫(kù)函數(shù)進(jìn)行spi dma發(fā)送和接收函數(shù)讀取設(shè)備函數(shù)一直為0xFF的原因?

    我用hal庫(kù)函數(shù)進(jìn)行spi dma發(fā)送和接收函數(shù)讀取設(shè)備函數(shù)一直為0xFF,不清楚問(wèn)題出現(xiàn)在哪里,我感覺(jué)是片問(wèn)題,但不知道怎么排查
    發(fā)表于 04-03 06:58

    低功耗定時(shí)器選擇外部的32K做時(shí)鐘源,在cubeMX中這個(gè)mode模式應(yīng)該哪個(gè)?

    低功耗定時(shí)器選擇外部的32K做時(shí)鐘源,在cubeMX中這個(gè)mode模式應(yīng)該哪個(gè)呢,謝謝
    發(fā)表于 04-02 06:03