版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、編程高手之路—C 語言(十四)預(yù)處理過程預(yù)處理過程掃描源代碼,對(duì)其進(jìn)行初步的轉(zhuǎn)換,產(chǎn)生新的源代碼提供給編譯器。 可見預(yù)處理過程先于編譯器對(duì)源代碼進(jìn)行處理。在 C 語言中,并沒有任何內(nèi)在的機(jī)制來完成如下一些功能:在編譯時(shí)包含其他源文件、定義宏、根據(jù)條件決定編譯時(shí)是否包含某些代碼。要完成這些工作,就需要使用預(yù)處理程序。 盡管在目前絕大多數(shù)編譯器都包含了預(yù)處理程序,但通常認(rèn)為它們是獨(dú)立于編譯器的。 預(yù)處理過程讀入源代碼,檢查包含預(yù)處理指令的語
2、句和宏定義,并對(duì)源代碼進(jìn)行響應(yīng)的轉(zhuǎn)換。預(yù)處理過程還會(huì)刪除程序中的注釋和多余的空白字符。預(yù)處理指令是以#號(hào)開頭的代碼行。 #號(hào)必須是該行除了任何空白字符外的第一個(gè)字符。 #后是指令關(guān)鍵字,在關(guān)鍵字和#號(hào)之間允許存在任意個(gè)數(shù)的空白字符。整行語句構(gòu)成了一條預(yù)處理指令,該指令將在編譯器進(jìn)行編譯之前對(duì)源代碼做某些轉(zhuǎn)換。 下面是部分預(yù)處理指令:指令 用途# 空指令,無任何效果#include 包含一個(gè)源代碼文件#define 定義宏#undef 取
3、消已定義的宏#if 如果給定條件為真,則編譯下面代碼#ifdef 如果宏已經(jīng)定義,則編譯下面代碼#ifndef 如果宏沒有定義,則編譯下面代碼#elif 如果前面的#if 給定條件不為真,當(dāng)前條件為真,則編譯下面代碼#endif 結(jié)束一個(gè)#if……#else 條件編譯塊#error 停止編譯并顯示錯(cuò)誤信息一、文件包含#include 預(yù)處理指令的作用是在指令處展開被包含的文件。包含可以是多重的,也就是說一個(gè)被包含的文件中還可以包含其他文
4、件。標(biāo)準(zhǔn) C 編譯器至少支持八重嵌套包含。預(yù)處理過程不檢查在轉(zhuǎn)換單元中是否已經(jīng)包含了某個(gè)文件并阻止對(duì)它的多次包含。 這樣就可以在多次包含同一個(gè)頭文件時(shí),通過給定編譯時(shí)的條件來達(dá)到不同的效果。 例如:#define AAA#include t.c#undef AAA#include t.c為了避免那些只能包含一次的頭文件被多次包含,可以在頭文件中用編譯時(shí)條件來進(jìn)行控制。例如:/*my.h*/#ifndef MY_H#define MY_H
5、2.帶參數(shù)的#define 指令帶參數(shù)的宏和函數(shù)調(diào)用看起來有些相似??匆粋€(gè)例子:#define Cube(x) (x)*(x)*(x)可以時(shí)任何數(shù)字表達(dá)式甚至函數(shù)調(diào)用來代替參數(shù) x。 這里再次提醒大家注意括號(hào)的使用。宏展開后完全包含在一對(duì)括號(hào)中,而且參數(shù)也包含在括號(hào)中,這樣就保證了宏和參數(shù)的完整性??匆粋€(gè)用法:int num=8+2;volume=Cube(num);展開后為(8+2)*(8+2)*(8+2);如果沒有那些括號(hào)就變?yōu)?8
6、+2*8+2*8+2 了。下面的用法是不安全的:volume=Cube(num++);如果 Cube 是一個(gè)函數(shù),上面的寫法是可以理解的。 但是,因?yàn)?Cube 是一個(gè)宏,所以會(huì)產(chǎn)生副作用。這里的擦?xí)皇呛?jiǎn)單的表達(dá)式,它們將產(chǎn)生意想不到的結(jié)果。它們展開后是這樣的:volume=(num++)*(num++)*(num++);很顯然,結(jié)果是 10*11*12,而不是 10*10*10;那么怎樣安全的使用 Cube 宏呢?必須把可能產(chǎn)生副作
7、用的操作移到宏調(diào)用的外面進(jìn)行:int num=8+2;volume=Cube(num);num++;3.#運(yùn)算符出現(xiàn)在宏定義中的#運(yùn)算符把跟在其后的參數(shù)轉(zhuǎn)換成一個(gè)字符串。 有時(shí)把這種用法的#稱為字符串化運(yùn)算符。例如:#define PASTE(n) adhfkj#nmain(){printf(%s\n,PASTE(15));}宏定義中的#運(yùn)算符告訴預(yù)處理程序,把源代碼中任何傳遞給該宏的參數(shù)轉(zhuǎn)換成一個(gè)字符串。所以輸出應(yīng)該是 adhfkj1
溫馨提示
- 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. 眾賞文庫僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- envi對(duì)sar數(shù)據(jù)的預(yù)處理過程
- c語言編程技巧
- c語言編程實(shí)驗(yàn)
- 木薯渣熱水預(yù)處理過程產(chǎn)物生成規(guī)律研究.pdf
- dsp高手成長(zhǎng)之路
- 魚雷罐鐵水噴粉預(yù)處理過程模擬與優(yōu)化研究.pdf
- 課程設(shè)計(jì)---信號(hào)分析與處理c語言編程
- 鐵水預(yù)處理過程AOD除塵灰再利用技術(shù)研究.pdf
- 生物氧化預(yù)處理過程氧化還原電位預(yù)估建模方法研究.pdf
- c語言編程100題
- c語言基礎(chǔ)編程題
- 基于玉米秸稈乙醇化的生化組合預(yù)處理過程機(jī)理研究
- c語言編程題匯總
- c語言高級(jí)編程[1]
- 會(huì)計(jì)高手學(xué)習(xí)成長(zhǎng)之路
- 單片機(jī)按鍵處理技巧及c語言編程方式
- 污泥預(yù)處理-厭氧消化工藝性能及預(yù)處理過程中有機(jī)物變化.pdf
- c語言程序設(shè)計(jì)_2 第10章 編譯預(yù)處理
- 高寒地區(qū)生物氧化預(yù)處理過程溫度場(chǎng)分布模型研究.pdf
- 基于玉米秸稈乙醇化的生化組合預(yù)處理過程機(jī)理研究.pdf
評(píng)論
0/150
提交評(píng)論