編程高手之路c語言十四預(yù)處理過程_第1頁
已閱讀1頁,還剩4頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論