創(chuàng)新互聯(lián)www.cdcxhl.cn八線(xiàn)動(dòng)態(tài)BGP香港云服務(wù)器提供商,新人活動(dòng)買(mǎi)多久送多久,劃算不套路!
這篇文章將為大家詳細(xì)講解有關(guān)什么是宏定義函數(shù),文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
在預(yù)處理時(shí),對(duì)程序中所有出現(xiàn)的“宏名”,都用宏定義中的字符串去代換,這稱(chēng)為“宏代換”或“宏展開(kāi)”。宏定義是由源程序中的宏定義命令完成的。宏代換是由預(yù)處理程序自動(dòng)完成的。若字符串是表達(dá)式,我們稱(chēng)之為函數(shù)式宏定義。
我們以下面兩行代碼為例,展開(kāi)描述:
函數(shù)式宏定義:#define MAX(a,b) ((a)>(b)?(a):(b))
普通函數(shù) :MAX(a,b) { return a>b?a:b;}
(1)函數(shù)式宏定義的參數(shù)沒(méi)有類(lèi)型,預(yù)處理器只負(fù)責(zé)做形式上的替換,而不做參數(shù)類(lèi)型檢查,所以傳參時(shí)要格外小心。
(2)函數(shù)式宏定義要注意格式,尤其是括號(hào)。
若上面的宏定義式函數(shù)寫(xiě)成#define MAX(a,b) (a>b?a:b)省去內(nèi)層括號(hào),宏展開(kāi)后由于運(yùn)算符優(yōu)先級(jí),運(yùn)行結(jié)果出錯(cuò);若上面的宏定義式函數(shù)省去外層括號(hào),宏定義為 ++MAX(a,b),則宏展開(kāi)就成了 ++(a)>(b)?(a):(b),運(yùn)算優(yōu)先級(jí)也是錯(cuò)了。
(3)若函數(shù)參數(shù)為表達(dá)式,則普通函數(shù)的調(diào)用與函數(shù)式宏定義的替換過(guò)程是不一樣的。
普通函數(shù)調(diào)用時(shí)先求實(shí)參表達(dá)式的值再傳給形參,如果實(shí)參表達(dá)式有Side Effect,那么這些SideEffect只發(fā)生一次。例如MAX(++a, ++b),如果MAX是普通函數(shù),a和b只增加一次。但如果MAX函數(shù)式宏定義,則要展開(kāi)成k = ((++a)>(++b)?(++a):(++b)),a和b就不一定是增加一次還是兩次了。所以若參數(shù)是表達(dá)式,替換函數(shù)式宏定義時(shí)一定要仔細(xì)看好。
(4)調(diào)用真正函數(shù)的代碼和調(diào)用函數(shù)式宏定義的代碼編譯生成的指令不同。
如果MAX是個(gè)普通函數(shù),那么它的函數(shù)體return a > b ? a : b; 要編譯生成指令,代碼中出現(xiàn)的每次調(diào)用也要編譯生成傳參指令和call指令。而如果MAX是個(gè)函數(shù)式宏定義,這個(gè)宏定義本身倒不必編譯生成指令,但是代碼中出現(xiàn)的每次調(diào)用編譯生成的指令都相當(dāng)于一個(gè)函數(shù)體,而不是簡(jiǎn)單的幾條傳參指令和call指令。所以,使用函數(shù)式宏定義編譯生成的目標(biāo)文件會(huì)比較大。
優(yōu)勢(shì):
首先,函數(shù)調(diào)用會(huì)帶來(lái)額外的開(kāi)銷(xiāo),它需要開(kāi)辟一片??臻g,記錄返回地址,將形參壓棧,從函數(shù)返回還要釋放堆棧,這種開(kāi)銷(xiāo)會(huì)降低代碼效率,而使用宏定義則在代碼規(guī)模和速度方面比函數(shù)更勝一籌;
其次,函數(shù)的參數(shù)必須被聲明為一種特定的類(lèi)型,所以它只能在類(lèi)型合適的表達(dá)式上使用,我們?nèi)绻容^兩個(gè)浮點(diǎn)型的大小,就不得不再寫(xiě)一個(gè)專(zhuān)門(mén)針對(duì)浮點(diǎn)型大小的比較函數(shù),反之,上面的宏定義可以用于整型、長(zhǎng)整型、單浮點(diǎn)型、雙浮點(diǎn)型及其他可以用“<”操作符比較值大小的類(lèi)型,也就是說(shuō),宏與類(lèi)型無(wú)關(guān)。
關(guān)于什么是宏定義函數(shù)就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
分享名稱(chēng):什么是宏定義函數(shù)-創(chuàng)新互聯(lián)
網(wǎng)站URL:http://jinyejixie.com/article32/ccjesc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)、微信小程序、品牌網(wǎng)站制作、關(guān)鍵詞優(yōu)化、虛擬主機(jī)、網(wǎng)站營(yíng)銷(xiāo)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容