真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

什么是宏定義函數(shù)

這篇文章將為大家詳細講解有關(guān)什么是宏定義函數(shù),文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比清遠網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式清遠網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋清遠地區(qū)。費用合理售后完善,十多年實體公司更值得信賴。

在預(yù)處理時,對程序中所有出現(xiàn)的“宏名”,都用宏定義中的字符串去代換,這稱為“宏代換”或“宏展開”。宏定義是由源程序中的宏定義命令完成的。宏代換是由預(yù)處理程序自動完成的。若字符串是表達式,我們稱之為函數(shù)式宏定義。

我們以下面兩行代碼為例,展開描述:

函數(shù)式宏定義:#define MAX(a,b) ((a)>(b)?(a):(b))

普通函數(shù) :MAX(a,b) { return a>b?a:b;}

(1)函數(shù)式宏定義的參數(shù)沒有類型,預(yù)處理器只負責做形式上的替換,而不做參數(shù)類型檢查,所以傳參時要格外小心。

(2)函數(shù)式宏定義要注意格式,尤其是括號。

若上面的宏定義式函數(shù)寫成#define MAX(a,b) (a>b?a:b)省去內(nèi)層括號,宏展開后由于運算符優(yōu)先級,運行結(jié)果出錯;若上面的宏定義式函數(shù)省去外層括號,宏定義為 ++MAX(a,b),則宏展開就成了 ++(a)>(b)?(a):(b),運算優(yōu)先級也是錯了。

(3)若函數(shù)參數(shù)為表達式,則普通函數(shù)的調(diào)用與函數(shù)式宏定義的替換過程是不一樣的。

普通函數(shù)調(diào)用時先求實參表達式的值再傳給形參,如果實參表達式有Side Effect,那么這些SideEffect只發(fā)生一次。例如MAX(++a, ++b),如果MAX是普通函數(shù),a和b只增加一次。但如果MAX函數(shù)式宏定義,則要展開成k = ((++a)>(++b)?(++a):(++b)),a和b就不一定是增加一次還是兩次了。所以若參數(shù)是表達式,替換函數(shù)式宏定義時一定要仔細看好。

(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)用編譯生成的指令都相當于一個函數(shù)體,而不是簡單的幾條傳參指令和call指令。所以,使用函數(shù)式宏定義編譯生成的目標文件會比較大。

優(yōu)勢:

首先,函數(shù)調(diào)用會帶來額外的開銷,它需要開辟一片??臻g,記錄返回地址,將形參壓棧,從函數(shù)返回還要釋放堆棧,這種開銷會降低代碼效率,而使用宏定義則在代碼規(guī)模和速度方面比函數(shù)更勝一籌;

其次,函數(shù)的參數(shù)必須被聲明為一種特定的類型,所以它只能在類型合適的表達式上使用,我們?nèi)绻容^兩個浮點型的大小,就不得不再寫一個專門針對浮點型大小的比較函數(shù),反之,上面的宏定義可以用于整型、長整型、單浮點型、雙浮點型及其他可以用“<”操作符比較值大小的類型,也就是說,宏與類型無關(guān)。

關(guān)于什么是宏定義函數(shù)就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。


網(wǎng)站標題:什么是宏定義函數(shù)
標題網(wǎng)址:http://weahome.cn/article/pojsps.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部