日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

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

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

當(dāng)使用參數(shù)調(diào)用宏時(shí),會將參數(shù)替換為宏主體

Q4MP_gh_c472c21 ? 來源:技術(shù)讓夢想更偉大 ? 作者:李肖遙 ? 2020-11-16 16:41 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

語法錯(cuò)誤

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

#definetwice(x)(2*(x)) #definecall_with_1(x)x(1) call_with_1(twice) //x=1 →twice(1) →(2*(1))

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

#definestrange(file)fprintf(file,"%s%d", … strange(stderr)p,35) →fprintf(stderr,"%s%d",p,35)

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

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

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

#defineceil_div(x,y)(x+y-1)/y

假定其用法如下:

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

拓展開是

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

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

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

如果我們將宏定義為

#defineceil_div(x,y)((x)+(y)-1)/(y)

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

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

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

#defineceil_div(x,y)((((x)+(y)-1)/(y))

吞噬分號

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

#defineSKIP_SPACES(p,limit) {char*lim=(limit); while(p

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

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

這可能會在else語句之前出問題,因?yàn)榉痔枌?shí)際上是空語句。假設(shè)你寫

if(*p!=0) SKIP_SPACES(p,lim); else…

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

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

#defineSKIP_SPACES(p,limit) do{char*lim=(limit); while(p

SKIP_SPACES (p, lim);擴(kuò)展為

do{…}while(0);

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

重復(fù)調(diào)用

我們常見的“最小”定義一個(gè)宏min,如下所示:

#definemin(X,Y)((X)

當(dāng)將此宏與包含副作用的參數(shù)一起使用時(shí),如此處所示,

next=min(x+y,foo(z));

它擴(kuò)展如下:

next=((x+y)

其中x + y替換了X,而foo(z)替換了Y。

函數(shù)foo出現(xiàn)在程序中的語句中僅使用一次,但是表達(dá)式foo(z)已兩次替換到宏擴(kuò)展中。結(jié)果,執(zhí)行該語句時(shí)可能會兩次調(diào)用foo,所以min是一個(gè)不安全的宏。

解決此問題的最佳方法是以僅計(jì)算一次foo(z)值的方式定義min。C語言沒有提供執(zhí)行此操作的標(biāo)準(zhǔn)方法,但是可以使用GNU擴(kuò)展來完成此操作,如下所示:

#definemin(X,Y) ({typeof(X)x_=(X); typeof(Y)y_=(Y); (x_

“({{…})”符號產(chǎn)生一個(gè)復(fù)合表達(dá)式,它的值是其最后一條語句的值。

如果不使用GNU C擴(kuò)展,唯一的解決方案是在使用宏min時(shí)要小心。例如計(jì)算foo(z)的值時(shí),將其保存在變量中,然后在min中使用該變量:

//假設(shè)foo返回int類型 #definemin(X,Y)((X)

自引用宏

自引用宏是其名稱出現(xiàn)在其定義中的宏。我們知道所有宏定義都將被重新掃描以查找更多要替換的宏,如果自引用被認(rèn)為是宏的使用,它將產(chǎn)生無限大的擴(kuò)展。

為防止這種情況,自引用不被視為宏調(diào)用。它原樣傳遞到預(yù)處理器輸出中。舉個(gè)例子

#definefoo(4+foo)

按照普通規(guī)則,其宏定義分析如下

對foo的每個(gè)引用都將擴(kuò)展為(4 + foo);

然后將對其進(jìn)行重新掃描,并將其擴(kuò)展為(4 +(4 + foo));

以此類推,直到計(jì)算機(jī)內(nèi)存耗盡。

自引用規(guī)則將這一過程縮短了一步,即(4 + foo),因此此宏定義可能會導(dǎo)致程序在引用foo的任何地方將foo的值加4。

閱讀程序的人看到foo是變量,就難以記得它也是宏,真的會坑爹的。它的一種常見有用用法是創(chuàng)建一個(gè)可擴(kuò)展為其自身的宏。如果你寫

#defineEPERMEPERM

然后宏EPERM擴(kuò)展為EPERM。實(shí)際上,每當(dāng)在運(yùn)行文本中使用預(yù)處理器時(shí),預(yù)處理器都會將其單獨(dú)保留。

如果宏x擴(kuò)展為使用宏y,而y的擴(kuò)展引用了宏x,則這是x的間接自引用。在這種情況下,x也不展開,舉個(gè)例子

#definex(4+y) #definey(2*x)

然后x和y擴(kuò)展如下:

x→(4+y) →(4+(2*x)) y→(2*x) →(2*(4+y))

當(dāng)每個(gè)宏出現(xiàn)在另一個(gè)宏的定義中時(shí),它們將被展開,但是當(dāng)它間接出現(xiàn)在其自己的定義中時(shí),則不會被展開。

參數(shù)預(yù)掃描處理

宏參數(shù)在被替換為宏主體之前必須經(jīng)過完全宏擴(kuò)展,替換后,將再次掃描整個(gè)宏主體,包括替換的參數(shù),以查找要擴(kuò)展的宏。

如果參數(shù)包含任何宏調(diào)用,則它們將在第一次掃描時(shí)擴(kuò)展,那么結(jié)果不包含任何宏調(diào)用,因此第二次掃描不會更改它。

如果按照給定的方式替換了參數(shù),并且沒有進(jìn)行預(yù)掃描,則剩余的單個(gè)掃描將找到相同的宏調(diào)用并產(chǎn)生相同的結(jié)果。

預(yù)掃描處理在以下三種特殊情況下有大的作用。

對宏的嵌套調(diào)用

當(dāng)宏的參數(shù)包含對該宏的調(diào)用時(shí),就會發(fā)生對宏的嵌套調(diào)用,舉個(gè)例子。

如果f是期望一個(gè)參數(shù)的宏,則f(f(1))是對f的嵌套調(diào)用對。通過擴(kuò)展f(1)并將其代入f的定義來進(jìn)行所需的擴(kuò)展。預(yù)掃描會導(dǎo)致發(fā)生預(yù)期的結(jié)果。

如果沒有預(yù)掃描,f(1)本身將被替換為參數(shù),并且f的內(nèi)部使用將在主掃描期間作為間接自引用出現(xiàn),并且不會擴(kuò)展。

調(diào)用其他可進(jìn)行字符串化或連接的宏的宏

如果參數(shù)是字符串化或串聯(lián)的,則不會進(jìn)行預(yù)掃描。

如果要擴(kuò)展宏,然后對其擴(kuò)展進(jìn)行字符串化或串聯(lián),則可以通過使一個(gè)宏調(diào)用進(jìn)行該字符串化或串聯(lián)的另一宏來實(shí)現(xiàn)。舉個(gè)例子

#defineAFTERX(x)X_##x #defineXAFTERX(x)AFTERX(x) #defineTABLESIZE1024 #defineBUFSIZETABLESIZE

然后AFTERX(BUFSIZE)擴(kuò)展為X_BUFSIZE,而XAFTERX(BUFSIZE)擴(kuò)展為X_1024而不是X_TABLESIZE,預(yù)掃描始終會進(jìn)行完整的擴(kuò)展。

參數(shù)中使用的宏,其擴(kuò)展名包含未屏蔽的逗號。

這可能導(dǎo)致使用錯(cuò)誤數(shù)量的參數(shù)調(diào)用在第二次掃描時(shí)擴(kuò)展的宏。舉個(gè)例子

#definefooa,b #definebar(x)lose(x) #definelose(x)(1+(x))

我們預(yù)期的結(jié)果是bar(foo)變成(1 +(foo)),然后變成(1 +(a,b))。

然而bar(foo)擴(kuò)展為loss(a,b)會出錯(cuò),因?yàn)長os需要一個(gè)參數(shù)。在這種情況下,該問題可以通過使用相同的括號輕松解決,該括號應(yīng)用于防止算術(shù)運(yùn)算的錯(cuò)誤嵌套:

#definefoo(a,b) or #definebar(x)lose((x))

多余的一對括號可防止foo定義中的逗號被解釋為參數(shù)分隔符。

參數(shù)中的換行符

類似函數(shù)的宏的調(diào)用可以擴(kuò)展到許多邏輯行,但是在本實(shí)施方式中,整個(gè)擴(kuò)展是一行完成的。

因此,由編譯器或調(diào)試器發(fā)出的行號是指調(diào)用在其上開始的行,這可能與包含導(dǎo)致問題的參數(shù)的行不同,例如:

#defineignore_second_arg(a,b,c)a;c ignore_second_arg(foo(), ignored(), syntaxerror);

由Syntax error on tokens觸發(fā)的語法錯(cuò)誤會導(dǎo)致錯(cuò)誤消息引用第三行(ignore_second_arg行),即使有問題的代碼來自第五行。

責(zé)任編輯:lq

聲明:本文內(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)注

    30

    文章

    4977

    瀏覽量

    74420
  • 變量
    +關(guān)注

    關(guān)注

    0

    文章

    616

    瀏覽量

    29573
  • 語法
    +關(guān)注

    關(guān)注

    0

    文章

    45

    瀏覽量

    10692

原文標(biāo)題:避免這7個(gè)誤區(qū),才能讓【宏】削鐵如泥

文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

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

掃碼添加小助手

加入工程師交流群

    評論

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

    極速溫變 精準(zhǔn)可靠 —— 廣東展快速溫變箱的技術(shù)實(shí)力與行業(yè)應(yīng)用

    電子、汽車、醫(yī)療等行業(yè)的優(yōu)選測試方案。一、核心性能參數(shù):從溫域到速率,定義測試精度展快速溫變箱的性能參數(shù)直接對標(biāo)國際一線水平,為嚴(yán)苛測試提供堅(jiān)實(shí)基礎(chǔ):·溫域覆蓋:
    的頭像 發(fā)表于 03-28 10:08 ?185次閱讀
    極速溫變 精準(zhǔn)可靠 —— 廣東<b class='flag-5'>宏</b>展快速溫變箱的技術(shù)實(shí)力與行業(yè)應(yīng)用

    低成本鍵盤旋鈕開源項(xiàng)目介紹

    辦公切軟件、調(diào)參數(shù)太繁瑣?創(chuàng)作時(shí)控筆刷 / 縮放總找快捷鍵?商用鍵盤價(jià)格高,還難適配個(gè)性化操作需求?想自制鍵盤,卻遇設(shè)計(jì)復(fù)雜、組裝難度高的問題?
    的頭像 發(fā)表于 03-25 11:09 ?570次閱讀

    微科技首家歐洲全資子公司正式成立

    在國家積極鼓勵(lì)企業(yè)“走出去”及共建“一帶一路”倡議的宏大背景下,國內(nèi)功率半導(dǎo)體領(lǐng)域的領(lǐng)先企業(yè)——江蘇微科技股份有限公司(以下簡稱“微科技”)今日宣布,其首家歐洲全資子公司 MacMic
    的頭像 發(fā)表于 03-04 11:06 ?675次閱讀

    展設(shè)備選型|高低溫試驗(yàn)箱與冷熱沖擊試驗(yàn)箱核心參數(shù)全對比

    高新技術(shù)企業(yè),廣東展科技憑借兩類設(shè)備的成熟研發(fā)制造經(jīng)驗(yàn),形成了覆蓋多行業(yè)的測試解決方案。本文從核心參數(shù)、結(jié)構(gòu)設(shè)計(jì)、適用場景三大維度展開對比,結(jié)合展產(chǎn)品特性給出精準(zhǔn)
    的頭像 發(fā)表于 02-05 13:54 ?299次閱讀
    <b class='flag-5'>宏</b>展設(shè)備選型|高低溫試驗(yàn)箱與冷熱沖擊試驗(yàn)箱核心<b class='flag-5'>參數(shù)</b>全對比

    龍芯中科與杉科技完成產(chǎn)品適配互認(rèn)證

    近日,龍芯中科技術(shù)股份有限公司與杭州杉科技股份有限公司完成基于龍芯3C6000處理器平臺對杉分布式存儲系統(tǒng)的適配與性能驗(yàn)證。測試結(jié)果表明,杉分布式存儲產(chǎn)品在龍芯3C6000平臺上運(yùn)行穩(wěn)定、性能優(yōu)異,標(biāo)志著雙方在國產(chǎn)自主計(jì)算
    的頭像 發(fā)表于 01-23 17:08 ?998次閱讀
    龍芯中科與<b class='flag-5'>宏</b>杉科技完成產(chǎn)品適配互認(rèn)證

    C語言中實(shí)現(xiàn)函數(shù)的三種方式

    : #define INT_SWAP(a,b) int tmp = a; a = b; b = tmp 但上述的具有一個(gè)明顯的缺點(diǎn):當(dāng)遇到 if、while 等語句且不使用花括號僅調(diào)用
    發(fā)表于 12-29 07:34

    微科技一舉斬獲兩項(xiàng)重磅行業(yè)大獎(jiǎng)

    聚力創(chuàng)新動(dòng)能,破局產(chǎn)業(yè)難題,領(lǐng)航技術(shù)前沿!近期深圳半導(dǎo)體與電源技術(shù)領(lǐng)域盛會密集,微科技攜旗下子公司上海微愛賽半導(dǎo)體有限公司(以下簡稱“微愛賽”)強(qiáng)勢亮相。憑借突出的技術(shù)實(shí)力與產(chǎn)品性能,
    的頭像 發(fā)表于 12-19 17:22 ?1039次閱讀
    <b class='flag-5'>宏</b>微科技一舉斬獲兩項(xiàng)重磅行業(yè)大獎(jiǎng)

    泰科技與ADI正式簽署合作備忘錄

    近日,南京泰半導(dǎo)體科技股份有限公司(以下簡稱“泰科技”)與全球領(lǐng)先的高性能半導(dǎo)體公司ADI正式簽署合作備忘錄,雙方將在半導(dǎo)體測試與精密信號測量領(lǐng)域展開持續(xù)深度合作,共同推動(dòng)高性能測試系統(tǒng)的技術(shù)創(chuàng)新與市場應(yīng)用落地。
    的頭像 發(fā)表于 12-02 09:09 ?1726次閱讀

    齊光多種不同封裝貼片發(fā)光管點(diǎn)亮多元應(yīng)用新視界

    在當(dāng)今快速發(fā)展的科技時(shí)代,貼片發(fā)光管憑借其體積小、功耗低、亮度高、色彩豐富等優(yōu)點(diǎn),廣泛應(yīng)用于各個(gè)領(lǐng)域。齊光多種不同封裝貼片發(fā)光管點(diǎn)亮多元應(yīng)用新視界,為現(xiàn)代生活和工業(yè)生產(chǎn)帶來了諸多便利與創(chuàng)新。那么
    的頭像 發(fā)表于 10-17 16:51 ?1592次閱讀
    <b class='flag-5'>宏</b>齊光多種不同封裝貼片發(fā)光管點(diǎn)亮多元應(yīng)用新視界

    SConscript結(jié)果與rtconfig.h中定義相反,是什么原因呢?

    當(dāng)我在rtconfig.h中把定義注釋時(shí),添加了構(gòu)建 當(dāng)我取消定義注釋時(shí),反而排除了構(gòu)建 SConscript結(jié)果與rtconfig.h中定義相反,是什么原因呢
    發(fā)表于 09-23 06:01

    干貨放送!集科技物聯(lián)網(wǎng)技術(shù)直播精選問答集錦,建議收藏!

    集直播圓滿結(jié)束,感謝各位熱情參與!直播上,集科技多位高級技術(shù)工程師針對不同產(chǎn)線的實(shí)際應(yīng)用場景,為大家分析如何突破瓶頸,提高生產(chǎn)效率。直播中,我們收到了眾多提問,展現(xiàn)了大家對集物聯(lián)網(wǎng)解決方案的興趣和對行業(yè)未來的深切關(guān)注
    的頭像 發(fā)表于 08-08 18:24 ?685次閱讀
    干貨放送!<b class='flag-5'>宏</b>集科技物聯(lián)網(wǎng)技術(shù)直播精選問答集錦,建議收藏!

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

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

    景智駕再獲老股東追加投資

    近日,景智駕再次獲得老股東博將資本與衢州智遠(yuǎn)的追加投資。在競爭激烈、技術(shù)迭代加速的市場環(huán)境下,此次支持彰顯了投資方對景智駕核心能力與長期發(fā)展?jié)摿Φ母叨日J(rèn)可。
    的頭像 發(fā)表于 06-09 11:06 ?1001次閱讀

    Vicor助力發(fā)打造主動(dòng)懸架電源系統(tǒng)

    廈門發(fā)電聲股份有限公司(發(fā))打造業(yè)內(nèi)性能卓越的主動(dòng)懸架電源系統(tǒng),旨在將長期以來僅見于豪華車型的功能引入中端車型。發(fā)成功突破困擾知名汽車技術(shù)供應(yīng)商幾十年的技術(shù)瓶頸,在滿足主動(dòng)懸架系統(tǒng)對尺寸、重量及瞬態(tài)性能的嚴(yán)苛需求的同時(shí),兼
    的頭像 發(fā)表于 06-04 15:24 ?1368次閱讀

    微科技2025供應(yīng)商大會成功舉辦

    近日,以“協(xié)同·精進(jìn)·共贏”為主題的微科技2025供應(yīng)商大會在常州隆重召開。來自全國各地的專家和供應(yīng)商伙伴們齊聚一堂,與微科技共同回顧合作成果,展望未來藍(lán)圖。
    的頭像 發(fā)表于 05-30 15:33 ?1105次閱讀
    江安县| 盐边县| 庆云县| 新竹市| 泗水县| 军事| 静宁县| 青浦区| 静乐县| 游戏| 疏附县| 新乐市| 凭祥市| 禹城市| 天气| 安图县| 沅陵县| 兴城市| 贞丰县| 石景山区| 德江县| 华坪县| 井陉县| 阿克苏市| 仁化县| 华阴市| 汝州市| 公安县| 五常市| 乌鲁木齐县| 随州市| 鄂托克旗| 错那县| 太康县| 西安市| 大名县| 澜沧| 勐海县| 万山特区| 龙井市| 河间市|