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

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

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

如何才能避免【宏】的這七個誤區(qū)

電子設(shè)計 ? 來源:電子設(shè)計 ? 作者:電子設(shè)計 ? 2020-12-24 14:29 ? 次閱讀

語法錯誤

當使用參數(shù)調(diào)用宏時,會將參數(shù)替換為宏主體,并與其他輸入文件一起檢查結(jié)果,以進行更多的宏調(diào)用,可以將部分來自宏主體和部分自變量的宏調(diào)用組合在一起。例如,

#define twice(x) (2*(x))

#define call_with_1(x) x(1)

call_with_1 (twice)

//x=1

→ twice(1)

→ (2*(1))

宏定義不必帶有括號,通過在宏主體中編寫不平衡的開放括號,可以創(chuàng)建一個從宏主體內(nèi)部開始但在宏主體外部結(jié)束的宏調(diào)用。例如,

#define strange(file) fprintf (file, "%s %d",

strange(stderr) p, 35)
→ fprintf (stderr, "%s %d", p, 35)

組合宏調(diào)用的功能可能會很有用,但是在宏主體中使用不平衡的開放括號只會造成混淆,應(yīng)該避免。

運算符優(yōu)先級問題

在大多數(shù)宏定義示例中,每次出現(xiàn)的宏參數(shù)名稱都帶有括號,并且另一對括號通常會包圍整個宏定義,這是編寫宏最好的方式。舉個例子

#define ceil_div(x, y) (x + y - 1) / y

假定其用法如下:

a = ceil_div(b&c,sizeof(int));

拓展開是

a =(b&c + sizeof(int)-1)/ sizeof(int);

這沒有達到我們的預(yù)期,C的運算符優(yōu)先級規(guī)則使其等效于此,而我們想要的是:

a =(((b&c)+ sizeof(int)-1))/ sizeof(int);

如果我們將宏定義為

#define ceil_div(x,y)((x)+(y)-1)/(y)

可能導(dǎo)致另一種情況,sizeof ceil_div(1,2)是一個C表達式,可以計算ceil_div(1,2)類型的大小,它擴展為:

sizeof((1)+(2)-1)/(2)

這將采用整數(shù)的大小并將其除以2,而除法包含在內(nèi)部的sizeof之外。所以整個宏定義的括號可防止此類問題。那么,下面是定義ceil_div的正確方法如下

#define ceil_div(x,y)((((x)+(y)-1)/(y))

吞噬分號

通常需要定義一個擴展為復(fù)合語句的宏。例如,考慮以下宏,該宏跨空格字符前進一個指針(參數(shù)p表示在何處查找):

#define SKIP_SPACES(p, limit)

{ char *lim = (limit);

while (p < lim) {

if (*p++ ?。?' ') {

p--; break; }}}

該宏定義必須是單個邏輯行,嚴格來說,該調(diào)用擴展為復(fù)合語句,這是一個完整的語句,不需要用分號結(jié)束。

但是,由于它看起來像函數(shù)調(diào)用,因此,如果可以像使用函數(shù)調(diào)用一樣使用它,則可以最大程度地減少混亂,然后再寫一個分號,就像在SKIP_SPACES(p,lim)中一樣。

這可能會在else語句之前出問題,因為分號實際上是空語句。假設(shè)你寫

if (*p ?。?0)

SKIP_SPACES (p, lim);

else …

在if條件和else條件之間存在兩個語句(復(fù)合語句和null語句)使C代碼無效。

怎么解決?我們可以使用do…while語句更改宏SKIP_SPACES的定義以解決此問題。方法如下:

#define SKIP_SPACES(p, limit)

do { char *lim = (limit);

while (p < lim) {

if (*p++ ?。?' ') {

p--; break; }}}

while (0)

SKIP_SPACES (p, lim);擴展為

do {…} while (0);

這是一個陳述,循環(huán)僅執(zhí)行一次,而且大多數(shù)編譯器不會為此生成任何額外的代碼。

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

    關(guān)注

    3

    文章

    4237

    瀏覽量

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

    關(guān)注

    30

    文章

    4671

    瀏覽量

    67769
收藏 人收藏

    評論

    相關(guān)推薦

    NE5534導(dǎo)入到Pspice只有七個腳,且按照生成的.lib文件對應(yīng)的管腳連接的電路仿真出錯怎么解決?

    NE5534導(dǎo)入到Pspice只有七個腳 且按照生成的.lib文件對應(yīng)的管腳連接的電路仿真出錯 求解NE5534的準確pspice模型
    發(fā)表于 08-15 08:10

    必看!光伏并網(wǎng)逆變器的3典型認識誤區(qū)

    必看!光伏并網(wǎng)逆變器的3典型認識誤區(qū)-古瑞瓦特 逆變器作為光伏系統(tǒng)的中樞控制器,對整個系統(tǒng)的運行和產(chǎn)出起到關(guān)鍵作用。當系統(tǒng)出現(xiàn)待機、停機、告警、故障、發(fā)電量未達預(yù)期、數(shù)據(jù)監(jiān)控中斷等問題時,運維人員
    的頭像 發(fā)表于 07-11 16:32 ?331次閱讀
    必看!光伏并網(wǎng)逆變器的3<b class='flag-5'>個</b>典型認識<b class='flag-5'>誤區(qū)</b>

    如何避免工業(yè)級路由器使用誤區(qū),提高網(wǎng)絡(luò)效率

    工業(yè)級路由器在工業(yè)自動化、物聯(lián)網(wǎng)等領(lǐng)域發(fā)揮著至關(guān)重要的作用。然而,由于其應(yīng)用環(huán)境的特殊性,使用過程中容易出現(xiàn)一些誤區(qū),導(dǎo)致網(wǎng)絡(luò)效率低下。本文將針對這些誤區(qū),提出相應(yīng)的解決方案,幫助讀者避免使用
    的頭像 發(fā)表于 04-12 14:15 ?190次閱讀

    路由器代理商如何避免常見的誤區(qū)

    作為路由器代理商,要成功在競爭激烈的市場環(huán)境中立足,需對常見誤區(qū)保持清醒認識,并制定相應(yīng)策略避免。從產(chǎn)品定位、渠道選擇和營銷策略等方面剖析,為可持續(xù)發(fā)展提供指導(dǎo)。
    的頭像 發(fā)表于 03-03 16:51 ?287次閱讀

    分布式控制系統(tǒng)的七個功能和應(yīng)用

    分布式控制系統(tǒng)的七個功能和應(yīng)用? 分布式控制系統(tǒng)是一種由多個獨立的控制單元組成的系統(tǒng),每個控制單元負責系統(tǒng)中的一部分功能。它具有分散的、自治的特性,可以提高系統(tǒng)的可靠性、靈活性和可擴展性。分布式控制
    的頭像 發(fā)表于 02-01 10:51 ?1065次閱讀

    微控制器的七個串行接口

    我們將簡要介紹七個串行接口:SIO、UART、SSP(SPI)、I2C、CAN、USB和EtherMAC。雖然每個接口都有幾個不同的操作模式,但我們只介紹一典型的模式。
    的頭像 發(fā)表于 01-11 09:30 ?1890次閱讀
    微控制器的<b class='flag-5'>七個</b>串行接口

    低功耗設(shè)計的幾個誤區(qū)分享

    誤區(qū)一:我們系統(tǒng)是220V供電,就不用在乎功耗問題了 點評:低功耗設(shè)計并不僅僅是為了省電,更多的好處在于降低了電源模塊及散熱系統(tǒng)的成本、由于電流的減小也減少了電磁輻射和熱噪聲的干擾。隨著設(shè)備
    發(fā)表于 01-09 08:04

    藍牙m(xù)esh網(wǎng)絡(luò)的七個特點

    藍牙m(xù)esh網(wǎng)絡(luò)的七個特點
    的頭像 發(fā)表于 12-21 11:20 ?773次閱讀
    藍牙m(xù)esh網(wǎng)絡(luò)的<b class='flag-5'>七個</b>特點

    ad9942 Hcounter在VD_X下降沿的后第七個cli上升沿置0,這里的作用是是什么?

    問題1 如下圖,Hcounter 在VD_X下降沿的后第七個cli上升沿置0,這里的作用是是什么,為什么在第七個位置置0?Hcounter 在ad9942內(nèi)部那些信號或者序列會使用到? 有沒有VD
    發(fā)表于 12-21 06:08

    如何降低接地電阻及需避免的工作誤區(qū)

    如何降低接地電阻及需避免的工作誤區(qū) 一、引言 接地電阻是指地面和物體之間的電阻,是電流通過接地體時的阻礙。在電氣工程中,合理的接地設(shè)計和低接地電阻對于保護人身安全和設(shè)備運行具有至關(guān)重要的作用。本文將
    的頭像 發(fā)表于 12-15 10:50 ?565次閱讀

    電容放電需避免的十二個操作誤區(qū)

    電容放電是一種常見的電學(xué)實驗和應(yīng)用技術(shù),但在進行電容放電實驗或應(yīng)用時,存在一些操作誤區(qū),可能會導(dǎo)致不良的結(jié)果或安全問題。
    的頭像 發(fā)表于 12-14 10:29 ?695次閱讀

    模擬設(shè)計中噪聲分析的11誤區(qū)

    電子發(fā)燒友網(wǎng)站提供《模擬設(shè)計中噪聲分析的11誤區(qū).pdf》資料免費下載
    發(fā)表于 11-28 10:25 ?0次下載
    模擬設(shè)計中噪聲分析的11<b class='flag-5'>個</b><b class='flag-5'>誤區(qū)</b>

    避免在高低溫試驗箱選購中走入誤區(qū)的幾個關(guān)鍵點

    避免在高低溫試驗箱選購中走入誤區(qū)的幾個關(guān)鍵點
    的頭像 發(fā)表于 10-26 10:27 ?326次閱讀
    <b class='flag-5'>避免</b>在高低溫試驗箱選購中走入<b class='flag-5'>誤區(qū)</b>的幾個關(guān)鍵點

    怎么才能避免SD卡頻繁讀寫防止死機機制 ?

    怎么才能避免SD卡頻繁讀寫防止死機機制
    發(fā)表于 10-23 08:14

    模擬設(shè)計中噪聲分析的11誤區(qū),你知道嗎?

    模擬設(shè)計中噪聲分析的11誤區(qū),你知道嗎? 噪聲是電路設(shè)計中不可避免的一因素,因此,在進行模擬電路設(shè)計時,噪聲分析是非常重要的。噪聲分析的目的是確定電路中的各種噪聲源,并計算這些噪聲
    的頭像 發(fā)表于 10-20 14:37 ?379次閱讀