C語言預處理——宏定義

    當對一個源文件進行編譯時,系統將自動調用預處理程序對文件中與處理部分進行處理,完成後才進入對源程序的編譯。

所謂宏定義,是使用一個標識符來表示一個字符串。宏有兩種,一種是不帶參數的宏,一種是帶參數的宏,如下所示:

不帶參數:#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了。

發佈了18 篇原創文章 · 獲贊 4 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章