讀古今文學網 > C語言解惑 > 15.4 使用宏定義函數 >

15.4 使用宏定義函數

有時傳值的函數實現不了預期的功能,這時可以考慮用宏來定義函數。

【例15.6】假設字符數組buf裡存放的是數字字符,編程將數字字符倒序輸出。


#include <stdio.h>
#define SWAP
(a
,b
) {char temp
;  temp=b
;  b=a
;  a=temp
;}
void main
( 
)
{
      int i=0
, j=0
;
      char buf[16]
;
      gets
(buf
);
      while
(buf[i]
!='\0'
)
          i++
;
      for
(j=0
;j<i/2
;j++
)
          SWAP
(buf[j]
,buf[i-1-j]
);
      printf
(buf
);
      printf
("\n"
);
}
  

程序輸出結果如下。


9876543210
0123456789
  

其實語句「SWAP(buf[j],buf[i-1-j]);」有兩個「;」號,多了一個「;」號不影響結果,因為「;」構成一個空語句。按定義應寫成「SWAP(buf[j],buf[i-1-j])」,這樣語句尾部就沒有「;」號,但會讓人咋看起來以為是錯誤語句,會不由自主地為它增加「;」號。但不管怎樣,都不影響程序的正確性。

在有些地方就不這樣幸運了,下面是一個簡單的if-else結構。


for
(j=0
;j<i/2
;j++
)
      if 
(i>0
) SWAP
(buf[j]
,buf[i-1-j]
);
         else printf
("
錯誤!"
);
  

由於多了一個「;」號,造成語法錯誤。少寫「;」號,又讓人覺得不習慣。可以換一種結構解決這個問題。下面是使用do~while結構定義的例子。


#define SWAP
(a
,b
)    do{  char temp
;  temp=b
;  b=a
;  a=temp
; } while
(0
)
  

因為只需要執行一次,所以用while(0)作為循環條件。這時,如果if語句不寫「;」號,就會造成語法錯誤,這種處理就使它符合了編程習慣。