1、宏與函數(shù)的區(qū)別主要在于是否返回值,一般函數(shù)都有返回值,宏是不可以的。宏和函數(shù)都不必須要求參數(shù),參數(shù)都是可有可無(wú)的。

創(chuàng)新互聯(lián)是一家專業(yè)提供周寧企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站制作、做網(wǎng)站、H5頁(yè)面制作、小程序制作等業(yè)務(wù)。10年已為周寧眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站制作公司優(yōu)惠進(jìn)行中。
2、用函數(shù),因?yàn)橐泻瘮?shù)調(diào)用,增加了執(zhí)行時(shí)的開銷,效率不如宏,但是可代碼重用。用宏雖然沒(méi)有函數(shù)調(diào)用,但是因?yàn)樵谑褂眠@個(gè)宏的地方,代碼會(huì)被展開編譯,增加了程序文件的大小。總起來(lái)說(shuō),參數(shù)和宏是一個(gè)用空間換時(shí)間還是用時(shí)間換空間的抉擇。
簡(jiǎn)單來(lái)說(shuō):宏定義又稱為宏代換、宏替換,簡(jiǎn)稱“宏”。宏替換是C/C++的預(yù)處理中的一部分,在C++標(biāo)準(zhǔn)中有4條規(guī)則來(lái)定義替換。
規(guī)則1:實(shí)參替換。
本條規(guī)則描述帶參數(shù)的宏的替換過(guò)程。
對(duì)于宏定義中的形參,在替換列表中,如果不是作為#或##的操作數(shù),那么將對(duì)應(yīng)實(shí)參完全
展開(相當(dāng)于對(duì)實(shí)參進(jìn)行求值),然后將替換列表中的形參替換掉.如果是#或##的操作數(shù),
那么不進(jìn)行替換。
規(guī)則2:多次掃描。
在所有的形參替換為實(shí)參后,對(duì)結(jié)果進(jìn)行再次掃描,如果發(fā)現(xiàn)還有可替換的宏,則進(jìn)行替換,
否則中止。
規(guī)則3:遞歸替換抑制。
如果在替換列表中發(fā)現(xiàn)當(dāng)前正在展開的宏的名字,那么這里不進(jìn)行替換.更進(jìn)一步,在嵌套
的替換過(guò)程中發(fā)現(xiàn)已經(jīng)替換過(guò)的宏的名字,則不進(jìn)行替換。
規(guī)則4:遞歸預(yù)處理抑制。
如果替換后的結(jié)果形成預(yù)處理指令,則不執(zhí)行這條預(yù)處理指令。
看幾個(gè)C++標(biāo)準(zhǔn)中的例子:
#define x 3
#define f(a) f(x * (a))
#undef x
#define x 2
#define g f
#define z z[0]
#define h g(~
#define m(a) a(w)
#define w 0,1
#define t(a) a
f(y+1) + f(f(z)) % t(t(g)(0) + t)(1);
g(x+(3,4)-w) | h 5) m(f)^m(m);
其結(jié)果分別是
f(2 * (y+1)) + f(2 * (f(2 * (z[0])))) % f(2 * (0)) + t(1);
f(2 * (2+(3,4)-0,1)) | f(2 * ( ~ 5)) f(2 * (0,1))^m(0,1);
對(duì)于第一個(gè),主要在于t(t(g)(0) + t)(1)的展開。
容易計(jì)算出最外層的t的實(shí)參是f(2 * (0)) + t,而作為t的參數(shù)傳入時(shí)其中的t是
正在被展開的宏,所以根據(jù)規(guī)則3,不對(duì)這個(gè)t進(jìn)行處理,保持不變,得到f(2 * (0)) + t(1)。
對(duì)于第二個(gè),h 5)被替換為g(~5),應(yīng)用規(guī)則2,被替換為f(2 * ( ~ 5))。
而m(m)首先被替換為m(w),然后應(yīng)用規(guī)則2再次進(jìn)行替換,但是m已經(jīng)是替換過(guò)的了,所以保持
不變,只對(duì)w進(jìn)行替換。
#define str(s) # s
#define xstr(s) str(s)
#define debug(s, t) printf("x" # s "= %d, x" # t "= %s", \
x ## s, x ## t)
#define INCFILE(n) vers ## n /* from previous #include example */
#define glue(a, b) a ## b
#define xglue(a, b) glue(a, b)
#define HIGHLOW "hello"
#define LOW LOW ", world"
debug(1, 2);
fputs(str(strncmp("abc\0d", "abc", ’\4’) /* this goes away */
== 0) str(: @\n), s);
#include xstr(INCFILE(2).h)
glue(HIGH, LOW);
xglue(HIGH, LOW)
其結(jié)果分別是
printf("x" "1" "= %d, x" "2" "= %s", x1, x2);
fputs("strncmp(\"abc\\0d\", \"abc\", ’\\4’) = = 0" ": @\n", s);
#include "vers2.h"
"hello";
"hello" ", world"
關(guān)鍵是glue和xglue.
對(duì)于glue(HIGH, LOW),首先有一個(gè)規(guī)則1的抑制,得到HIGHLOW;的結(jié)果,然后二次掃描,得到
"hello";
對(duì)于xglue(HIGH, LOW)沒(méi)有抑制效果,所以對(duì)參數(shù)求值,分別得到HIGH和LOW ", world",即
glue(HIGH, LOW ", world")。
然后進(jìn)行連接操作得到HIGHLOW ", world",最后再掃描一次得到"hello" ", world"
如果考慮字符串的自然的連接,就可以得到"hello, world"了。
擴(kuò)展資料
宏語(yǔ)言是一類編程語(yǔ)言,其全部或多數(shù)計(jì)算是由擴(kuò)展宏完成的。宏語(yǔ)言并未在通用編程中廣泛使用,但在文本處理程序中應(yīng)用普遍。例如, C preprocessor C預(yù)處理器Internet Macros(iOpus) M4(如前所述,源于ATT,捆綁于Unix)
宏定義
c程序提供的預(yù)處理功能之一。包括帶參數(shù)的宏定義和不帶參數(shù)的宏定義。具體是指用一個(gè)指定的標(biāo)志符來(lái)進(jìn)行簡(jiǎn)單的字符串替換或者進(jìn)行闡述替換。形式為:
#define標(biāo)志符[(參數(shù)表)] 字符串
宏名
在上定義中的標(biāo)志符被稱為“宏名”。
宏展開
在c程序編譯時(shí)將宏名替換成字符串的過(guò)程稱為“宏展開”。
宏語(yǔ)言是一類編程語(yǔ)言,其全部或多數(shù)計(jì)算是由擴(kuò)展宏完成的。宏語(yǔ)言并未在通用編程中廣泛使用, 但在文本處理程序中應(yīng)用普遍。例如,
C preprocessorC 預(yù)處理器
Internet Macros(iOpus)
M4(如前所述,源于ATT,捆綁于Unix)
參考資料來(lái)源:百度百科-宏
#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)行效率自然就高了
的確是不可以當(dāng)函數(shù)的參數(shù),但是可以換一個(gè)間接的思路。
將宏定義放在另一個(gè)函數(shù)里,通過(guò)取地址的方式來(lái)把你原先想去處理的參數(shù)進(jìn)行處理。
示例如下:
#includestdio.h
#define cal(m) {m = m + 10;}
int main(void)
{
int Val_0 = 20;
test(Val_0);
printf("%d", Val_0);
system("pause");
}
int test(int *n)
{
cal(*n);
printf("hello\n");
return 0;
}
網(wǎng)站標(biāo)題:c語(yǔ)言宏代替函數(shù),C語(yǔ)言宏函數(shù)怎么用
文章源于:http://chinadenli.net/article31/dsgespd.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、靜態(tài)網(wǎng)站、企業(yè)網(wǎng)站制作、手機(jī)網(wǎng)站建設(shè)、網(wǎng)站導(dǎo)航、商城網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)