所謂宏定義,是使用一個標識符來表示一個字符串。宏有兩種,一種是不帶參數的宏,一種是帶參數的宏,如下所示:
不帶參數:#define PI 3.14159
帶參數:#define MAX(a,b) (a>b)?a:b
不帶參數比較容易理解,帶參數的宏需要注意以下幾點:
①宏定義中的形式參數指示標誌符,不分配內存空間,宏調用過程也只是符號替換,不存在值的傳遞。
②宏名和形式參數之間不能加空格,否則會被認爲是無參數的宏定義。
例如 #define MAX (a,b) (a>b)?a:b,該語句的宏調用語句變爲了:max=(a,b)(a>b)?a:b,顯然不正確。
③宏定義中字符串內的形式參數和整個字符串最好都用括號括起來,以便面調用時出錯。下面詳細說明。
看下面簡單程序
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 #define MUL(a,b) a*b 5 int main() 6 { 7 int k=MUL(2+3,4); 8 printf("k=%d",k); 9 return 0; 10 }
輸出結果爲14,這樣結果的原因是調用MUL後宏展開形式爲2+3*4。所以要得出正確結果,必須將a和b都用括號擴上,將宏定義改成下面這樣
#define MUL(a,b) (a)*(b)
再看結果就是20了,但這樣是否就可以了。看下面的例子
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 #define MUL(a,b) (a)*(b) 5 int main() 6 { 7 float k=10/MUL(2,5); 8 printf("k=%f",k); 9 return 0; 10 }
結果是25,這是怎麼回事呢,原因是展開宏後就是k=10/2*5,所以不僅要將宏定義中單個變量用括號括起來,運算式子也要用括號括起來,如下:
#define MUL(a,b) ((a)*(b))
這樣結果就是1了。