




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
本文格式為Word版,下載可任意編輯——C語言的預(yù)處理代碼C語言的預(yù)處理代碼
導(dǎo)語:預(yù)處理是程序在被編譯器編譯以前,由預(yù)處理器預(yù)先舉行的處理。預(yù)處理代碼含有“#”作為符號標(biāo)志,以區(qū)分其他源代碼。下面是C語言的預(yù)處理代碼,一起來學(xué)習(xí)下吧:
1.#include頭文件
其實就是把頭文件的內(nèi)容全部替換到當(dāng)前#include處。
關(guān)于頭文件的好處、來源、用法可以參考/pashanhuxp/article/details/39927913一文
補(bǔ)充:
①.#include和#include“XXX.h”的識別:
表示在編譯器定義的引用目次查找.h頭文件;
“XX”表示先在工程當(dāng)前目次查找.h頭文件,若沒有再去編譯器指定的目次查找;
所以,若引用自定義的.h頭文件,只能用#include“XX”。
②.在EclipseCDT下,#includeXX.h指引用usr/include目次下的頭文件,并不包括子文件夾的頭文件,若引用子文件夾下的頭文件,需要改為#include“XX/XX.h”
2.#define宏定義:
宏定義也可以稱作“宏替換”,宏會在編譯之前被預(yù)處理程序替換掉。通常用大寫表示
宏定義可以增加程序的可讀性和可維護(hù)性,譬如#definePI3.14159
并且宏替換函數(shù),可以提高運(yùn)行效率,裁減函數(shù)調(diào)用造成的系統(tǒng)開銷。譬如#definesuma,b,ca+b+c比定義一個求和函數(shù)intsuma,b,c要節(jié)省內(nèi)存,提高效率。這里需要留神替換的意思,宏是被直接替換的,譬如#defineAAa-b若不加括號,那么在使用過程中,會展現(xiàn)cc*AA變成cc*a-b的錯誤。
關(guān)于空的宏定義的補(bǔ)充:
①空的宏定義修飾函數(shù):#defineSUM
代碼中有時會展現(xiàn)#defineSUM并沒給宏SUM“賦值”。這時可以將sum理解成空的,無意義的。
譬如用來修飾函數(shù):SUMintgetSuma,b這時可以將SUM的作用理解為對函數(shù)作用舉行簡樸的描述,使調(diào)用者更明白
②空的宏定義常見于頭文件中,防止頭文件的內(nèi)容被重復(fù)包含。平日:最好養(yǎng)成這種寫頭文件的習(xí)慣
#ifndef_8_4_2_H_
#define_8_4_2_H_
...頭文件內(nèi)容...
#endif/*8_4_2_H_*/
這時_8_4_2_H_宏就是一個空宏,用于條件編譯,有時常見于防止頭文件重復(fù)包含的用途中。給你舉個例子,再順便分析一下:假設(shè)你的工程里面有4個文件,分別是a.cpp,b.h,c.h,d.h。a.cpp的頭部是:#includeb.h#includec.hb.h和c.h的頭部都是:#included.h而d.h里面有classD的定義。這樣一來,編譯器編譯a.cpp的時候,先根據(jù)#includeb.h去編譯b.h這個問題,再根據(jù)b.h里面的#included.h,去編譯d.h的這個文件,這樣就把d.h里面的classD編譯了;然后再根據(jù)a.cpp的其次句#includec.h,去編譯c.h,最終還是會找到的d.h里面的classD,但是classD之前已經(jīng)編譯過了,所以就會報重定義錯誤。
假設(shè)在d.h中加上
ifndef_D_H
define_D_H
頭文件內(nèi)容譬如定義classD
endif
就可以防止這種重定義錯誤。
③與條件編譯結(jié)合:
#ifdefineWINDOWS
針對windows的相關(guān)處理...
#endif
#ifdefineLINUX
...針對LINUX的相關(guān)操作
#endif
那么,通過#defineWINDOWS或者#defineLINUX,可以實現(xiàn)多系統(tǒng)下編程。
④#define后只有一個函數(shù),等價空函數(shù):#defineFUNCTIONargs
在頭文件中見到過這種處境,F(xiàn)UNCTIONargs函數(shù)在這里define為空,那么等價空函數(shù)實際不會舉行任何處理。
通常,在這個頭文件中,還其他已賦值的這個語句#defineFUNCTIONargsargs*5
使用舉例:
#ifdefineWIN
#defineFUNCTIONargsargs*5
#else
#defineFUNCTIONargs
#endif
假設(shè)define了WIN那么FUNCTIONargs會舉行一些概括的操作,否那么,F(xiàn)UNTIONargs并不會執(zhí)行任何處理。
這樣定義,便當(dāng)了調(diào)用者,即我在調(diào)用的時候,不需要花費(fèi)代碼去判斷是不是define了WIN,我都可以在我的代碼里直接使用FUNCTIONargs。定義了,那么會對參數(shù)舉行處理,而沒有定義的話,不會對參數(shù)舉行變更。
⑤還有一些編譯器預(yù)定義宏,格式是“雙下劃線開頭”。主要標(biāo)識一些編譯環(huán)境信息。對比少用到。
3.#條件編譯
使用條件編譯時,會判斷是否編譯器編譯當(dāng)前的代碼段。提高編譯效率。
#ifdef條件
代碼段。。。
#endif
解釋:若宏定義了條件,那么執(zhí)行代碼段,否那么不執(zhí)行。
#if條件
代碼段。。。
#endif
解釋:若條件為真,那么執(zhí)行代碼段,否那么不執(zhí)行。
使用舉例:
#if0
A
#endif
實際本代碼中A從不執(zhí)行,這樣寫是為了便當(dāng)以后調(diào)試更改,若想執(zhí)行A,那么只改為#if1即可。
4.#宏和函數(shù)的識別
1看一個例子,對比兩個數(shù)或者表達(dá)式大小,首先我們把它寫成宏定義:
#defineMAXa,baba:b
其次,把它用函數(shù)來實現(xiàn):
intmaxinta,intb
returnaba:b
很鮮明,我們不會選擇用函數(shù)來完成這個任務(wù),理由有兩個:
首先,函數(shù)調(diào)用會帶來額外的開銷,它需要開發(fā)一片棧空間,記錄返回地址,將形參壓棧,從函數(shù)返回還要釋放堆棧。這種開銷不僅會降低代碼效率,
而且代碼量也會大大增加,而使用宏定義那么在代碼規(guī)模和速度方面都比函數(shù)更勝一籌;
其次,函數(shù)的參數(shù)務(wù)必被聲明為一種特定的類型,所以它只能在類型適合的表達(dá)式上使用,我們假設(shè)要對比兩個浮點(diǎn)型的'大小,就不得不再寫一個特意針對浮點(diǎn)型的對比函數(shù)。反之,上面的那個宏定義可以用于整形、長整形、單浮點(diǎn)型、雙浮點(diǎn)型以及其他任何可以用“”操作符對比值大小的類型,也就是說,宏是與類型無關(guān)的。
2和使用函數(shù)相比,使用宏的不利之處在于每次使用宏時,一份宏定義代碼的拷貝都會插入到程序中。除非宏分外短,否那么使用宏會大幅度增加程序的長度。
3還有一些任務(wù)根本無法用函數(shù)實現(xiàn),但是用宏定義卻很好實現(xiàn)。譬如參數(shù)類型沒法作為參數(shù)傳遞給函數(shù),但是可以把參數(shù)類型傳遞給帶參的宏。
看下面的例子:
#defineMALLOCn,type/
type*mallocn*sizeoftype//“/”為強(qiáng)制換行符,表示下一行其實是在上一行的。
利用這個宏,我們就可以為任何類型調(diào)配一段我們指定的空間大小,并返回指向這段空間的指針。我們可以查看一下這個宏切當(dāng)?shù)墓ぷ鬟^程:
int*ptr;
ptr=MALLOC5,int
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 養(yǎng)殖庫房出售合同范本
- 單位鍋爐人員合同范本
- 個體工商合同范本
- 專業(yè)白蟻防治服務(wù)合同范本
- 養(yǎng)老機(jī)構(gòu)銷售合同范本
- 醫(yī)療設(shè)備議標(biāo)合同范本
- 化工鋼材采購合同范例
- 介紹費(fèi)協(xié)議合同范本
- 勞務(wù)派遣合同勞動合同范本
- 辦公品合同范本
- 銅及銅合金物理冶金基礎(chǔ)-黃銅
- 煤礦信息化管理制度
- 金融科技學(xué)-完整全套課件
- 物理學(xué)史中國古代物理學(xué)
- 導(dǎo)管滑脫應(yīng)急預(yù)案演練住院患者導(dǎo)尿管道滑脫
- (完整)小學(xué)語文考試專用作文方格紙
- 軟考中級網(wǎng)絡(luò)工程師學(xué)習(xí)筆記(考點(diǎn)歸納總結(jié)全)
- 小學(xué)語文六年級上冊期末質(zhì)量分析
- YS/T 914-2013動力鋰電池用鋁殼
- GB/T 28193-2011表面活性劑中氯乙酸(鹽)殘留量的測定
- 油田化學(xué)劑現(xiàn)狀及其發(fā)展趨勢課件
評論
0/150
提交評論