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