- 註冊時間
- 2006-10-8
- 最後登錄
- 2019-6-20
- 主題
- 查看
- 積分
- 1306
- 閱讀權限
- 110
- 文章
- 1388
- 相冊
- 0
- 日誌
- 1
   
狀態︰
離線
|
巨集指令 #define 宣告的格式如下
#define macroname string
其說明如下:
macroname 為一連串的字元(不含空白字元) 或是類似函數的標題,如 macroname(arg1, arg2) 含有左括號及右括號。
編譯器於前置處理時會將程式中出現 macroname 以 string 來替代。
巨集指令基本上是以一行為單位。因此替代字串是從 macroname 後第一個非空白字元起至該行結束。
如果巨集指令超過一行,則以反斜線 \ 表示下一行繼續下去。
巨集指令的使用(或呼叫),如同函數的呼叫,將 macroname 置於程式中,為一辨識個體(identifier)即可。對於含引數型的巨集指令(將於 8.1.2 節談到引數型的巨集指令),其呼叫方式與函數的呼叫型式完全一樣。
巨集指令的使用範圍為有宣告處起至檔案的結束,一般而言,巨集指令都是宣告於檔案的開端,或是宣告於檔頭,即檔案其副檔名為 .h 再以 #include 的方式加入。
例 1: 設有一 C 程式檔 file.c 其內容為:
#define MAXSIZE 100
main( )
{ int A[MAXSIZE]; }
於編譯時經過前置處理後,該程式變成
main( )
{ int A[100]; }
其中所有的 #define 指令都不見了,MAXSIZE 也都變成了 100。當然前 置處理後的結果我們也見不到。
第 8.1.1 節 常數辨識個體的宣告
為了程式易讀易維修,程式中的常數通常都是以巨集方式來宣告一常數名稱,該名稱通常是以大寫的字串來表示。本節將重複介紹 第 2.2.5 節 所提到的 符號常數。
例 2: 設有一 C 程式其內容如下:
#define MAXSIZE 100
:
:
main( )
{ int A[MAXSIZE]; .....;}
void f( )
{ ......
for (i=0;i < MAXSIZE; i++)
.........
}
說明:
由辨識體 MAXSIZE 本身即可明白該文的意義。
如果陣列的大小要改為 200,只要改巨集指令為 #define MAXSIZE 200 即可,整個程式仍保持其一致性。
一些常用的常數如 EOF, NULL 都是宣告於 stdio.h 檔中,要使用這些常數,於檔案中必須加上 #include 指令。前置處理指令 #include 將於 8.2 節中討論
第 8.1.2 節 含引數型的巨集指令
含引數型的巨集指令,其宣告格式為
#define macroname(arg1[,arg]) string1 arg1
其說明如下:
macroname 為該巨集指令的名稱
arg1 為其引數
string1 arg1 為其替代字串
其呼叫方式如同函數呼叫方式一樣。
例 3:對於巨集指令的宣告
#define set_nonnegative(A); if (A<0)\
A=A*(-1);
則於程式中
set_nonnegative(i);
經過前置處理後即變成
if(i<0)
i=i*(-1);
其中形式引數 A 皆由實際引數 i 來替代。
例 4:對於巨集指令的宣告
#define swap_int(A,B); {int t;\
t=A;A=B;B=t;}
於程式中巨集呼叫
swap_int(i,j);
經過前置處理後即變成
{int t; t=i; i=j; j=t;}
含引數的巨集指令,稍一不慎就會產生錯誤,如例 4 中 swap_int(s,t); 則會產生問題,為什麼?
巨集指令的宣告亦有階層式,即可利用前面宣告過的巨集指令,如例 5。
例 5:階層式巨集指令
#define max(A,B) ((A>B)?A:B)
#define max3(A,B,C) max( max(A,B),c)
問題:試比較 macro 與 function 的優劣點。
C++ 的 inline 作用如同 macro 的作用。
|
|