宏是用于編譯器處理的,他在程序編譯時(shí),會(huì)在對(duì)應(yīng)位置展開成代碼。。,這就相當(dāng)于你在告訴編譯器,我想在這個(gè)位置加一些代碼,代碼的內(nèi)容已在宏中定義,請(qǐng)編譯器自己支找。。。,也就是說程序在運(yùn)行時(shí),早已變成了對(duì)應(yīng)位置上的代碼,此時(shí)已沒有宏的概念了。。。。
浦城網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)公司,浦城網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為浦城近千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)公司要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的浦城做網(wǎng)站的公司定做!
而函數(shù)則是運(yùn)行時(shí),調(diào)用。他不會(huì)在編譯時(shí),在對(duì)應(yīng)位置上加上函數(shù)代碼,只是加上一個(gè)函數(shù)入口指針。。。從這個(gè)入口去運(yùn)行一段代碼。。。運(yùn)行完了之后回到當(dāng)前位置繼續(xù)執(zhí)行。。。。
可以簡單的認(rèn)為,宏是在編譯時(shí)上起作用,而函數(shù)是運(yùn)行時(shí)起作用。。。
宏只是字符的替換,在預(yù)處理階段就給替換到代碼中去了比如下面的代碼
#include
#define
MAX(x,
y)
((x)(y)?(x):y())
int
main()
{
int
a
=
2,
b
=
4;
int
m;
m
=
MAX(2,
4);
printf("%d\n",
m);
return
0;
}
如果你用的是gcc編譯器,執(zhí)行
gcc
-E
main.c
-o
main.i,打開main.i文件就可以看到他是如何替換進(jìn)去的,直接拖到最后,前面的都是stdio.h中的內(nèi)容。
int
main()
{
int
a
=
2,
b
=
4;
int
m;
m
=
((2)(4)?(2):4());
printf("%d\n",
m);
return
0;
}
函數(shù)就不同了,函數(shù)還需要分配??臻g,在執(zhí)行函數(shù)時(shí)都要進(jìn)行入棧和出棧操作,有的還需要分配堆空間。
宏所實(shí)現(xiàn)的功能有限,而且長代碼不易讀,但是對(duì)于邏輯簡單、代碼不長、經(jīng)常使用的功能由宏來實(shí)現(xiàn)是個(gè)不錯(cuò)的選擇
#define
a(x,y)
xy?x*y:x+y
和
int
a(x,y)
{
return(x+y);
}
a(x+y,x*y)這個(gè)表達(dá)式對(duì)于以上兩種定義的得到的結(jié)果是不一樣的
而且,宏有宏的有點(diǎn),函數(shù)有函數(shù)的優(yōu)點(diǎn)
函數(shù)的優(yōu)點(diǎn)就是占用存儲(chǔ)空間少,缺點(diǎn)是每次調(diào)用函數(shù)都要調(diào)用中斷程序,影響運(yùn)行效率
宏的優(yōu)點(diǎn)就是直接宏展開,每次調(diào)用都要展開,所以比較占存儲(chǔ)空間,但是相應(yīng)的就不用調(diào)用中斷程序了,運(yùn)行效率自然就高了
區(qū)別:
1、宏會(huì)在編譯器在對(duì)源代碼進(jìn)行編譯的時(shí)候進(jìn)行簡單替換,不會(huì)進(jìn)行任何邏輯檢測,即簡單代碼復(fù)制而已。
2、宏進(jìn)行定義時(shí)不會(huì)考慮參數(shù)的類型。
3、參數(shù)宏的使用會(huì)使具有同一作用的代碼塊在目標(biāo)文件中存在多個(gè)副本,即會(huì)增長目標(biāo)文件的大小。
4、參數(shù)宏的運(yùn)行速度會(huì)比函數(shù)快,因?yàn)椴恍枰獏?shù)壓棧/出棧操作。
5、參數(shù)宏在定義時(shí)要多加小心,多加括號(hào)。
6、函數(shù)只在目標(biāo)文件中存在一處,比較節(jié)省程序空間。
7、函數(shù)的調(diào)用會(huì)牽扯到參數(shù)的傳遞,壓棧/出棧操作,速度相對(duì)較慢。
8、函數(shù)的參數(shù)存在傳值和傳地址(指針)的問題,參數(shù)宏不存在。