- 註冊時間
- 2006-10-8
- 最後登錄
- 2019-6-20
- 主題
- 查看
- 積分
- 1306
- 閱讀權限
- 110
- 文章
- 1392
- 相冊
- 0
- 日誌
- 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 的作用。
|
|