[轉-shmilxu的部落格]
1.#define的作用
在c或c++語言源程式中允許用乙個識別符號來表示乙個字串,稱為「巨集」。被定義為「巨集」的識別符號稱為「巨集名」。在編譯預處理時,對程式中所有出現的「巨集名」,都用巨集定義中的字串去代換,這稱為「巨集代換」或「巨集展開」。巨集定義是由源程式中的巨集定義命令完成的。巨集代換是由預處理程式自動完成的。
在c或c++語言中,「巨集」分為有引數和無引數兩種。
2.無參巨集定義
無參巨集的巨集名後不帶引數。
其定義的一般形式為:
#define 識別符號 字串
其中的「#」表示這是一條預處理命令。凡是以「#」開頭的均為預處理命令。「define」為巨集定義命令。「識別符號」為所定義的巨集名。「字串」可以是常數、表示式、格式串等。
例如:#define m (a+b)
它的作用是指定識別符號m來代替表示式(a+b)。在編寫源程式時,所有的(a+b)都可由m代替,而對源程式作編譯時,將先由預處理程式進行巨集代換,即用(a+b)表示式去置換所有的巨集名m,然後再進行編譯。
程式1:
#define m (a+b)
main()
上例程式中首先進行巨集定義,定義m來替代表示式(a+b),在 s= m * m 中作了巨集呼叫。在預處理時經巨集展開後該語句變為: s=(a+b)*(a+b)
但要注意的是,在巨集定義中表示式(a+b)兩邊的括號不能少。否則會發生錯誤。
如當作以下定義後:#difine m (a)+(b)
在巨集展開時將得到下述語句:s= (a)+(b)*(a)+(b)
對於巨集定義還要說明以下幾點:
1. 巨集定義是用巨集名來表示乙個字串,在巨集展開時又以該字串取代巨集名,這只是一種簡單的代換,字串中可以含任何字元,可以是常數,也可以是表示式,預處理程式對它不作任何檢查。如有錯誤,只能在編譯已被巨集展開後的源程式時發現。
2. 巨集定義不是說明或語句,在行末不必加分號,如加上分號則連分號也一起置換。
3. 巨集定義必須寫在函式之外,其作用域為巨集定義命令起到源程式結束。如要終止其作用域可使用#undef命令。
3.帶參巨集定義
c語言允許巨集帶有引數。在巨集定義中的引數稱為形式引數,在巨集呼叫中的引數稱為實際引數。對帶引數的巨集,在呼叫中,不僅要巨集展開,而且要用實參去代換形參。
帶參巨集定義的一般形式為:
#define巨集名(形參表)字串
在字串中含有各個形參。
帶參巨集呼叫的一般形式為:
巨集名(形參表)
例如:#define m(y) ((y)*(y)+3*(y)) /*巨集定義*/
k=m(5); /*巨集呼叫*/
在巨集呼叫時,用實參5去代替形參y,經預處理巨集展開後的語句為:
k=5*5+3*5
程式2:
#define max(a,b) (a>b)?a:b
main(){
int x,y,max;
printf("input two numbers: ");
scanf("%d%d",&x,&y);
max=max(x,y);
printf("max=%d\n",max);
上例程式的第一行進行帶參巨集定義,用巨集名max表示條件表示式(a>b)?a:b,形參a,b均出現在條件表示式中。程式第七行max=max(x,y)為巨集呼叫,實參x,y,將代換形參a,b。巨集展開後該語句為:
max=(x>y)?x:y;
用於計算x,y中的大數。
4.防止重複定義
#define 條件編譯
標頭檔案(.h)可以被標頭檔案或c檔案包含;
重複包含(重複定義)
由於標頭檔案包含可以巢狀,那麼c檔案就有可能包含多次同乙個標頭檔案,就可能出現重複定義的問題的。
通過條件編譯開關來避免重複包含(重複定義)例如
#ifndef __headerfile***__
#define __headerfile***__
檔案內容
#endif
define用法詳解
1.define的作用 在 或c 語言源程式中允許用乙個識別符號來表示乙個字串,稱為 巨集 被定義為 巨集 的識別符號稱為 巨集名 在編譯預處理時,對程式中所有出現的 巨集名 都用巨集定義中的字串去代換,這稱為 巨集代換 或 巨集展開 巨集定義是由源程式中的巨集定義命令完成的。巨集代換是由預處理程式...
define用法詳解
1.define的作用 在 或c 語言源程式中允許用乙個識別符號來表示乙個字串,稱為 巨集 被定義為 巨集 的識別符號稱為 巨集名 在編譯預處理時,對程式中所有出現的 巨集名 都用巨集定義中的字串去代換,這稱為 巨集代換 或 巨集展開 巨集定義是由源程式中的巨集定義命令完成的。巨集代換是由預處理程式...
define用法,C語言 define詳解
c語言中,可以用 define 定義乙個識別符號來表示乙個常量。其特點是 定義的識別符號不佔記憶體,只是乙個臨時的符號,預編譯後這個符號就不存在了。預編譯又叫預處理。預編譯不是編譯,而是編譯前的處理。這個操作是在正式編譯之前由系統自動完成的。用 define 定義識別符號的一般形式為 define ...