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

下載本文檔

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

文檔簡介

1、編程高手之路—C 語言(十四)預處理過程預處理過程掃描源代碼,對其進行初步的轉(zhuǎn)換,產(chǎn)生新的源代碼提供給編譯器。 可見預處理過程先于編譯器對源代碼進行處理。在 C 語言中,并沒有任何內(nèi)在的機制來完成如下一些功能:在編譯時包含其他源文件、定義宏、根據(jù)條件決定編譯時是否包含某些代碼。要完成這些工作,就需要使用預處理程序。 盡管在目前絕大多數(shù)編譯器都包含了預處理程序,但通常認為它們是獨立于編譯器的。 預處理過程讀入源代碼,檢查包含預處理指令的語

2、句和宏定義,并對源代碼進行響應的轉(zhuǎn)換。預處理過程還會刪除程序中的注釋和多余的空白字符。預處理指令是以#號開頭的代碼行。 #號必須是該行除了任何空白字符外的第一個字符。 #后是指令關鍵字,在關鍵字和#號之間允許存在任意個數(shù)的空白字符。整行語句構(gòu)成了一條預處理指令,該指令將在編譯器進行編譯之前對源代碼做某些轉(zhuǎn)換。 下面是部分預處理指令:指令 用途# 空指令,無任何效果#include 包含一個源代碼文件#define 定義宏#undef 取

3、消已定義的宏#if 如果給定條件為真,則編譯下面代碼#ifdef 如果宏已經(jīng)定義,則編譯下面代碼#ifndef 如果宏沒有定義,則編譯下面代碼#elif 如果前面的#if 給定條件不為真,當前條件為真,則編譯下面代碼#endif 結(jié)束一個#if……#else 條件編譯塊#error 停止編譯并顯示錯誤信息一、文件包含#include 預處理指令的作用是在指令處展開被包含的文件。包含可以是多重的,也就是說一個被包含的文件中還可以包含其他文

4、件。標準 C 編譯器至少支持八重嵌套包含。預處理過程不檢查在轉(zhuǎn)換單元中是否已經(jīng)包含了某個文件并阻止對它的多次包含。 這樣就可以在多次包含同一個頭文件時,通過給定編譯時的條件來達到不同的效果。 例如:#define AAA#include t.c#undef AAA#include t.c為了避免那些只能包含一次的頭文件被多次包含,可以在頭文件中用編譯時條件來進行控制。例如:/*my.h*/#ifndef MY_H#define MY_H

5、2.帶參數(shù)的#define 指令帶參數(shù)的宏和函數(shù)調(diào)用看起來有些相似??匆粋€例子:#define Cube(x) (x)*(x)*(x)可以時任何數(shù)字表達式甚至函數(shù)調(diào)用來代替參數(shù) x。 這里再次提醒大家注意括號的使用。宏展開后完全包含在一對括號中,而且參數(shù)也包含在括號中,這樣就保證了宏和參數(shù)的完整性??匆粋€用法:int num=8+2;volume=Cube(num);展開后為(8+2)*(8+2)*(8+2);如果沒有那些括號就變?yōu)?8

6、+2*8+2*8+2 了。下面的用法是不安全的:volume=Cube(num++);如果 Cube 是一個函數(shù),上面的寫法是可以理解的。 但是,因為 Cube 是一個宏,所以會產(chǎn)生副作用。這里的擦書不是簡單的表達式,它們將產(chǎn)生意想不到的結(jié)果。它們展開后是這樣的:volume=(num++)*(num++)*(num++);很顯然,結(jié)果是 10*11*12,而不是 10*10*10;那么怎樣安全的使用 Cube 宏呢?必須把可能產(chǎn)生副作

7、用的操作移到宏調(diào)用的外面進行:int num=8+2;volume=Cube(num);num++;3.#運算符出現(xiàn)在宏定義中的#運算符把跟在其后的參數(shù)轉(zhuǎn)換成一個字符串。 有時把這種用法的#稱為字符串化運算符。例如:#define PASTE(n) adhfkj#nmain(){printf(%s\n,PASTE(15));}宏定義中的#運算符告訴預處理程序,把源代碼中任何傳遞給該宏的參數(shù)轉(zhuǎn)換成一個字符串。所以輸出應該是 adhfkj1

溫馨提示

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

評論

0/150

提交評論