回覆列表
-
1 # 使用者1545299218855
-
2 # pzyyo24296
加括號是為了處理表達式引數(即宏的引數可能是個演算法表示式)時不出錯,因為宏替換就是文字替換,所以如果有以下情況:#define COM(A,B) (A)*(B)那麼COM(6+5,3)這個呼叫會怎麼替換呢?它會換成這樣:(6+5)*(3)顯然這是和COM宏的意圖一致的,但是如是去掉了定義中括號,即寫成這樣:#define COM(A,B) A*B那麼COM(6+5,3)這個呼叫會怎麼替換呢?它就會換成這樣:6+5*3這樣顯然就和宏的意圖不符合了。但是你所寫出的程式中的引數(即*p++和b)呼叫原程式的宏,這兩種情況沒區別.加括號是為了更通用。
格式:#define宏名(引數表)字串例如:#defineS(a,b)a*barea=S(3,2);第一步被換為area=a*b;,第二步被換為area=3*2;類似於函式呼叫:(1)實參如果是表示式容易出問題#defineS(r)r*rarea=S(a+b);第一步換為area=r*r;,第二步被換為area=a+b*a+b;正確的宏定義是#defineS(r)((r)*(r))(2)宏名和引數的括號間不能有空格(3)宏替換隻作替換,不做計算,不做表示式求解(4)函式呼叫在編譯後程序執行時進行,並且分配記憶體。宏替換在編譯前進行,不分配記憶體(5)宏的啞實結合不存在型別,也沒有型別轉換。(6)函式只有一個返回值,利用宏則可以設法得到多個值(7)宏展開使源程式變長,函式呼叫不會(8)宏展開不佔執行時間,只佔編譯時間,函式呼叫佔執行時間(分配記憶體、保留現場、值傳遞、返回值)