日韩在线免费播放-日韩在线免费av-日韩在线免费-日韩在线毛片-国产高清不卡视频-国产高清不卡

當(dāng)前位置:首頁(yè) > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > C語(yǔ)言中的宏

C語(yǔ)言中的宏 時(shí)間:2018-09-20      來(lái)源:未知

宏定義是我們C語(yǔ)言學(xué)習(xí)中非常重要的內(nèi)容。一些基礎(chǔ)的用法大家都比較清楚了,我們簡(jiǎn)單總結(jié)一下。

1.宏定義的格式為:#define 標(biāo)識(shí)符 字符串。

2.宏定義屬于預(yù)處理命令,在編譯過(guò)程中的預(yù)處理階段處理。

3.宏定義只是單純的替換,所以當(dāng)被替換內(nèi)容涉及運(yùn)算等的時(shí)候好加上括號(hào)()。

4.宏定義的標(biāo)示符一般用大寫。

5.宏定義的標(biāo)示符為常量標(biāo)示符,即不可再賦值。

6.宏定義末尾不加分號(hào)。

以上說(shuō)的是宏定義的近本用法,可以帶來(lái)很多好處。比如讓我們的標(biāo)示符有意義,讓我們的代碼修改更方便,可以替代在代碼中常用的字符串縮短代碼等。其實(shí)在宏定義中,我們也可以像一個(gè)“函數(shù)”一樣實(shí)現(xiàn)一個(gè)的功能,這種用法叫函數(shù)宏,函數(shù)宏在我們對(duì)宏定義的使用中更加的常江,下面我們從五個(gè)方面來(lái)了解下函數(shù)宏的使用。

1.函數(shù)宏的書寫

#defineMAX(a,b)((a)(b)?(a):(b)),這就是一個(gè)簡(jiǎn)單的函數(shù)宏,我們同樣可以傳遞參數(shù),實(shí)現(xiàn)功能。但是在書寫上注意兩點(diǎn)MAX和左“(”之間沒(méi)有空格,因?yàn)楹甓x把標(biāo)示符后的第一個(gè)空格會(huì)認(rèn)為是標(biāo)示符與字符串的分割。當(dāng)然我們?cè)趯懞甑臅r(shí)候有時(shí)候會(huì)寫多行,這樣我們一般用“\”進(jìn)行分割。

2.加括號(hào)

我們說(shuō)到宏只是簡(jiǎn)單的替換,即使是函數(shù)宏也是這樣的,所以為了避免一些優(yōu)先級(jí)的錯(cuò)誤不要忘記加括號(hào)。

3.宏的副作用

這也是函數(shù)宏和函數(shù)不同的地方。比如上邊的例子 #define MAX(a,b) ((a)>(b)?(a):(b))我們傳入的參數(shù)是++a和++b。很顯然如果使用函數(shù)實(shí)現(xiàn)這個(gè)功能的話a和b均自加一次,但是如果用宏實(shí)現(xiàn)替換后就變成((++a)>(++b)?(++a):(++b)),很明顯,這與函數(shù)就完全不同了。

4.do{}while(0)結(jié)構(gòu)

例如:

#define DELETE_POINTER(p) \

do \

{ \

if(NULL != p) \

delete p; \

p = NULL; \

}while(0)

這種結(jié)構(gòu)在函數(shù)宏里非常常見,它不僅可以在調(diào)用后加分號(hào)保持代碼的格式一致性,還可以避免一些復(fù)雜的宏定義產(chǎn)生的錯(cuò)誤。當(dāng)然,每行后面不要忘了也是需要”\”的。

5.函數(shù)宏中的#和##運(yùn)算符

在函數(shù)宏中#可以實(shí)現(xiàn)由函數(shù)宏實(shí)參生成字符串常量,##實(shí)現(xiàn)了由函數(shù)宏實(shí)參生成標(biāo)識(shí)符的一部分。(前者用于拼接字符串后者用于拼接標(biāo)示符)看一下下邊的示例:

#

假如希望在字符串中包含宏參數(shù),ANSIC允許這樣作,在類函數(shù)宏的替換部分,#符號(hào)用作一個(gè)預(yù)處理運(yùn)算符,它可以把語(yǔ)言符號(hào)轉(zhuǎn)化程字符串。例如,如果x是一個(gè)宏參量,那么#x可以把參數(shù)名轉(zhuǎn)化成相應(yīng)的字符串。該過(guò)程稱為字符串化(stringizing)。

#incldue

#define PSQR(x) printf("the square of" #x "is %d.\n",(x)*(x))

int main(void)

{

int y =4;

PSQR(y);

PSQR(2+4);

return 0;

}

輸出結(jié)果:

the square of y is 16.

the square of 2+4 is 36.

第一次調(diào)用宏時(shí)使用“y”代替#x;第二次調(diào)用時(shí)用“2+4"代#x。

##

##運(yùn)算符可以使用類函數(shù)宏的替換部分。另外,##還可以用于類對(duì)象宏的替換部分。這個(gè)運(yùn)算符把兩個(gè)語(yǔ)言符號(hào)組合成單個(gè)語(yǔ)言符號(hào)。例如:

#define XNAME(n) x##n

這樣宏調(diào)用:

XNAME(4)

展開后:x4

程序:

#include

#define XNAME(n) x##n

#define PXN(n) printf("x"#n" = %d\n",x##n)

int main(void)

{

int XNAME(1)=12;//int x1=12;

PXN(1);//printf("x1 = %d\n", x1);

return 0;

}

那么說(shuō)了這么多,大家一定有疑問(wèn),函數(shù)宏和函數(shù)的區(qū)別又有什么呢?我們把上面第一條的例子用函數(shù)來(lái)實(shí)現(xiàn):

int max( int a, int b)

{

return (a > b a : b)

}

如果這段代碼要頻繁使用,讓我們選擇用函數(shù)宏或者用函數(shù)來(lái)實(shí)現(xiàn)。很顯然,我們不會(huì)選擇用函數(shù)來(lái)完成這個(gè)任務(wù),原因有兩個(gè):首先,函數(shù)調(diào)用會(huì)帶來(lái)額外的開銷,它需要開辟一片?臻g,記錄返回地址,將形參壓棧,從函數(shù)返回還要釋放堆棧。這種開銷不僅會(huì)降低代碼效率,而且代碼量也會(huì)大大增加,而使用宏定義則在代碼規(guī)模和速度方面都比函數(shù)更勝一籌;其次,函數(shù)的參數(shù)必須被聲明為一種特定的類型,所以它只能在類型合適的表達(dá)式上使用,我們?nèi)绻容^兩個(gè)浮點(diǎn)型的大小,就不得不再寫一個(gè)專門針對(duì)浮點(diǎn)型的比較函數(shù)。反之,上面的那個(gè)宏定義可以用于整形、長(zhǎng)整形、單浮點(diǎn)型、雙浮點(diǎn)型以及其他任何可以用“>”操作符比較值大小的類型,也就是說(shuō),宏是與類型無(wú)關(guān)的。和使用函數(shù)相比,使用宏的不利之處在于每次使用宏時(shí),一份宏定義代碼的拷貝都會(huì)插入到程序中。除非宏非常短,否則使用宏會(huì)大幅度增加程序的長(zhǎng)度。還有一些任務(wù)根本無(wú)法用函數(shù)實(shí)現(xiàn),但是用宏定義卻很好實(shí)現(xiàn)。比如參數(shù)類型沒(méi)法作為參數(shù)傳遞給函數(shù),但是可以把參數(shù)類型傳遞給帶參的宏。

看下面的例子:

#define MALLOC(n, type) \

( (type *) malloc((n)* sizeof(type)))

利用這個(gè)宏,我們就可以為任何類型分配一段我們指定的空間大小,并返回指向這段空間的指針。我們可以觀察一下這個(gè)宏確切的工作過(guò)程:

int *ptr;

ptr = MALLOC ( 5, int );

將這宏展開以后的結(jié)果:

ptr = (int *) malloc ( (5) * sizeof(int) );

這個(gè)例子是宏定義的經(jīng)典應(yīng)用之一,完成了函數(shù)不能完成的功能。

把類型作為函數(shù)宏參數(shù)是C語(yǔ)言實(shí)現(xiàn)泛型的一種手段,這也是函數(shù)宏常用的場(chǎng)合之一。在后續(xù)出現(xiàn)的編程語(yǔ)言入C++中把這種需求作為一種新的語(yǔ)法特性(模板)加以實(shí)現(xiàn)。

我們主要介紹了函數(shù)宏的用法,熟練的掌握還需要更多的練習(xí),希望在以后代碼編程過(guò)程中可以將函數(shù)宏融入我們的代碼,使我們的代碼水平不斷提高。

上一篇:印制電路板(PCB)設(shè)計(jì)原則和抗干擾措施

下一篇:Ipv6 煙霧傳感器實(shí)驗(yàn)

熱點(diǎn)文章推薦
華清學(xué)員就業(yè)榜單
高薪學(xué)員經(jīng)驗(yàn)分享
熱點(diǎn)新聞推薦
前臺(tái)專線:010-82525158 企業(yè)培訓(xùn)洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠(yuǎn)見科技集團(tuán)有限公司 版權(quán)所有 ,京ICP備16055225號(hào)-5,京公海網(wǎng)安備11010802025203號(hào)

回到頂部

主站蜘蛛池模板: 骆文博| 中央新影中学生频道| 夜夜做新郎| lanarhoades在线av| 陈若仪个人简历资料| 潇洒的走简谱| 二胡演奏曲大全视频| 大家都在搜| 宇宙巨人希曼| 网络谜踪| 仓皇一夜| 奥特曼格斗进化重生破解版| 第一序列第二季上映了吗| 不速之客美国恐怖电影2014| 山下大辉| 广西地图全图可放大| 梁以辰| 远方的故乡简谱| 白洁少妇掀起裙子呻吟声视频| 欲盖弄潮电影| 变形金刚1免费完整版在线观看| 夜电影| 单位同意报考证明| 在屋顶上流浪| 飞艇全天精准计划软件| 那年秋天| 楼下的房客到底讲的什么| 大海啊故乡钢琴谱| 日本大片网址| 衣女裸体男 waxing| 人口高质量发展论文800字| 高照清雅| 四三二一| 热爱 电影| www.douyin.com| 白上关花电影在线观看免费| 密探| 玻璃笼| 罗中立的《父亲》详案| 初号机壁纸| 麦当娜简历|