版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026上半年貴州事業(yè)單位聯(lián)考松桃苗族自治縣招聘44人筆試參考題庫及答案解析
- 2025年新課堂國(guó)際教育筆試真題及答案
- 2025年銀河證券研究所筆試及答案
- 2025年湖南招教筆試真題及答案
- 2026西藏日喀則仲巴縣民政和退役軍人事務(wù)局招聘特困人員集中供養(yǎng)服務(wù)中心護(hù)理人員1人筆試備考試題及答案解析
- 2025年今年教資筆試考試真題及答案
- 2025年光伏新能源事業(yè)單位考試及答案
- 2026年流程再優(yōu)化年度工作總結(jié)與提升計(jì)劃
- 2025年陜西農(nóng)信社筆試題庫及答案
- 2026年綠色金融產(chǎn)品創(chuàng)新培訓(xùn)
- 2025鄭州餐飲行業(yè)市場(chǎng)深度調(diào)研及發(fā)展前景與投資前景研究報(bào)告
- 早產(chǎn)的臨床診斷與治療指南(2025年)
- 2025年黑龍江省大慶市檢察官逐級(jí)遴選筆試題目及答案
- JBP計(jì)劃培訓(xùn)課件
- 寵物民宿創(chuàng)業(yè)規(guī)劃
- 小學(xué)生家長(zhǎng)教育心得分享
- 2025年銀行柜員年終工作總結(jié)(6篇)
- 養(yǎng)生館運(yùn)營(yíng)成本控制與盈利模型
- 2025年廣東高校畢業(yè)生三支一扶考試真題
- 英語詞根詞綴詞匯教學(xué)全攻略
- T-GDDWA 001-2023 系統(tǒng)門窗應(yīng)用技術(shù)規(guī)程
評(píng)論
0/150
提交評(píng)論