首页 » C语言解惑 » C语言解惑全文在线阅读

《C语言解惑》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");}  

程序输出结果如下。


98765432100123456789  

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