link address:http://blog.sina.com.cn/s/blog_686188ef0100klku.html
#define是C語言中提供的宏定義命令,其主要目的是為程式員在編程時提供一定的方便,並能在一定程度上提高程式的運行效率,但學生在學習時往往不能 理解該命令的本質,總是在此處產生一些困惑,在編程時誤用該命令,使得程式的運行與預期的目的不一致,或者在讀別人寫的程式時,把運行結果理解錯誤,這對 C語言的學習很不利。
1 #define命令剖析
1.1 #define的概念
#define命令是C語言中的一個宏定義命令,它用來將一個標識符定義為一個字串,該標識符被稱為宏名,被定義的字串稱為替換文本。
該命令有兩種格式:一種是簡單的宏定義,另一種是帶參數的宏定義。
(1) 簡單的宏定義:
#define <宏名> <字串>
例: #define PI 3.1415926
(2) 帶參數的宏定義
#define <宏名> ( <參數表>) <宏體>
例: #define A(x) x
一個標識符被宏定義後,該標識符便是一個宏名。這時,在程式中出現的是宏名,在該程式被編譯前,先將宏名用被定義的字串替換,這稱為宏替換,替換後才進行編譯,宏替換是簡單的替換。
1.2 宏替換髮生的時機
為了能夠真正理解#define的作用,讓我們來瞭解一下對C語言來源程式的處理過程。當我們在一個整合的開發環境如Turbo C中將編寫好的來源程式進行編譯時間,實際經過了預先處理、編譯、彙編和串連幾個過程,見圖1。
來源程式
前置處理器
修改後的來源程式
編譯器
組譯工具
彙編器
可重定位的目標程式
連接器
可執行檔目標程式
圖1 C語言的編譯過程
其中前置處理器產生編譯器的輸出,它實現以下的功能:
(1) 檔案包含
可以把來源程式中的#include 擴充為檔案本文,即把包含的.h檔案找到並展開到#include 所在處。
(2) 條件編譯
前置處理器根據#if和#ifdef等編譯命令及其後的條件,將來源程式中的某部分包含進來或排除在外,通常把排除在外的語句轉換成空行。
(3) 宏展開
前置處理器將來源程式檔案中出現的對宏的引用展開成相應的宏 定義,即本文所說的#define的功能,由前置處理器來完成。
經過前置處理器處理的來源程式與之前的來源程式有所有不同,在這個階段所進行的工作只是純粹的替換與展開,沒有任何計算功能,所以在學習#define命令時只要能真正理解這一點,這樣才不會對此命令引起誤解並誤用
THE END!