映月读书网 > 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语句不写“;”号,就会造成语法错误,这种处理就使它符合了编程习惯。