C語言深入講解宏的定義與使用方法_第1頁
C語言深入講解宏的定義與使用方法_第2頁
C語言深入講解宏的定義與使用方法_第3頁
C語言深入講解宏的定義與使用方法_第4頁
C語言深入講解宏的定義與使用方法_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第C語言深入講解宏的定義與使用方法目錄一、C語言中的宏定義二、宏定義表達(dá)式三、宏表達(dá)式與函數(shù)的對(duì)比四、有趣的問題五、強(qiáng)大的內(nèi)置宏六、小結(jié)

一、C語言中的宏定義

#define是預(yù)處理器處理的單元實(shí)體之一#define定義的宏可以出現(xiàn)在程序的任意位置#define定義之后的代碼都可以使用這個(gè)宏#define定義的宏常量可以直接使用#define定義的宏常量本質(zhì)為字面量

下面的宏常量定義正確嗎?

編寫代碼來測(cè)試:

#defineERROR-1

#definePATH1"D:\test\test.c"

#definePATH2D:\test\test.c

#definePATH3D:\test\

test.c

intmain()

interr=ERROR;

char*p1=PATH1;

char*p2=PATH2;

char*p3=PATH3;

}

先使用gcc-ETest.c-oTest.i進(jìn)行預(yù)編譯,預(yù)編譯沒有報(bào)錯(cuò),結(jié)果如下:

#1"Test.c"

#1"built-in"

#1"command-line"

#1"Test.c"

intmain()

interr=-1;

char*p1="D:\test\test.c";

char*p2=D:\test\test.c;

char*p3=D:\testtest.c;

}

直接進(jìn)行編譯,發(fā)現(xiàn)char*p2=PATH2;char*p3=PATH3;報(bào)錯(cuò)

這說明宏定義是正確的,但是編譯是過不了的,只是

不符合語法規(guī)范。

二、宏定義表達(dá)式

#define表達(dá)式的使用類似函數(shù)調(diào)用#define表達(dá)式可以比函數(shù)更強(qiáng)大#define表達(dá)式比函數(shù)更容易出錯(cuò)

強(qiáng)大之處其中之一就是可以求數(shù)組的大小,這是不能編寫函數(shù)辦到的。

下面看一段宏表達(dá)式的代碼:

#includestdio.h

#define_SUM_(a,b)(a)+(b)

#define_MIN_(a,b)((a)(b)(a):(b))

#define_DIM_(a)sizeof(a)/sizeof(*a)

intmain()

inta=1;

intb=2;

intc[4]={0};

ints1=_SUM_(a,b);

ints2=_SUM_(a,b)*_SUM_(a,b);

intm=_MIN_(a++,b);

intd=_DIM_(c);

printf("s1=%d\n",s1);

printf("s2=%d\n",s2);

printf("m=%d\n",m);

printf("d=%d\n",d);

return0;

下面為輸出結(jié)果,但是s2我們預(yù)期的結(jié)果應(yīng)該是9,m的值我們預(yù)期的結(jié)果應(yīng)該是1,這是怎么回事呢?

下面進(jìn)行預(yù)編譯看看代碼到底是怎么運(yùn)行的,輸入gcc-ETest.c-oTest.i

intmain()

inta=1;

intb=2;

intc[4]={0};

ints1=(a)+(b);

ints2=(a)+(b)*(a)+(b);

intm=((a++)(b)(a++):(b));

intd=sizeof(c)/sizeof(*c);

printf("s1=%d\n",s1);

printf("s2=%d\n",s2);

printf("m=%d\n",m);

printf("d=%d\n",d);

return0;

}

通過上面宏定義的替換,我們很容易知道為什么結(jié)果跟我們想的不一樣。

三、宏表達(dá)式與函數(shù)的對(duì)比

宏表達(dá)式被預(yù)處理器處理,編譯器不知道宏表達(dá)式的存在宏表達(dá)式用實(shí)參完全替代形參,不進(jìn)行任何運(yùn)算宏表達(dá)式?jīng)]有任何的調(diào)用開銷宏表達(dá)式中不能出現(xiàn)遞歸定義

所以,下面遞歸定義就是錯(cuò)誤的:

四、有趣的問題

宏定義的常量或表達(dá)式是否有作用域限制(沒有)

下面看一個(gè)宏作用域分析的代碼:

#includestdio.h

voiddef()

#definePI3.1415926

#defineAREA(r)r*r*PI

doublearea(doubler)

returnAREA(r);

intmain()

doubler=area(5);

printf("PI=%f\n",PI);

printf("d=5;a=%f\n",r);

return0;

}

下面為輸出結(jié)果:

作用域的概念是針對(duì)C語言中的變量和函數(shù),不針對(duì)宏。宏表達(dá)式被預(yù)處理器處理,編譯器不知道宏表達(dá)式的存在。

五、強(qiáng)大的內(nèi)置宏

宏含義示例_FILE_被編譯的文件名file1.c_LINE_當(dāng)前行號(hào)25_DATE_編譯時(shí)的日期Jan312025_TIME_編譯時(shí)的時(shí)間17:01:01_STDC_編譯器是否遵循標(biāo)準(zhǔn)C規(guī)范1

下面看一個(gè)宏使用的綜合示例:

#includestdio.h

#includemalloc.h

#defineMALLOC(type,x)(type*)malloc(sizeof(type)*x)

#defineFREE(p)(free(p),p=NULL)

#defineLOG(s)printf("[%s]{%s:%d}%s\n",__DATE__,__FILE__,__LINE__,s)

#defineFOREACH(i,m)for(i=0;ii++)

#defineBEGIN{

#defineEND}

intmain()

intx=0;

int*p=MALLOC(int,5);

LOG("Begintorunmaincode...");

FOREACH(x,5)

BEGIN

p[x]=x;

FOREACH(x,5)

BEGIN

printf("%d\n",p[x]);

FREE(p);

LOG("End");

return0;

}

下面為輸出結(jié)果

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論