定义完备的多语句宏函数

定义完备的多语句宏函数

定义完备的多语句宏函数 #

通常情况下,为了与 C 代码的风格保持一致,在调用宏函数时,我们也会习惯性地为每一个调用语句的末尾加上分号。但也正是因为这样,当含有多行语句的宏函数与某些控制语句一起配合使用时,可能会出现意想不到的结果。比如下面这个例子:

#include <stdio.h>
#define SAY() printf("Hello, "); printf("world!")
int main(void) {
  int input;
  scanf("%d", &input);
  if (input > 0)
    SAY();
  return 0;
}

无论用户输入何值,字符串 “world!” 都会被打印。

那么,应该怎样解决这个问题呢?迭代语句 do…while 便可以满足这个要求。如下面这段代码所示,我们使用该语句,改写了宏函数 SAY 的实现方式。

#include <stdio.h>
#define SAY() \
  do { printf("Hello, "); printf("world!"); } while(0)
int main(void) {
  int input;
  scanf("%d", &input);
  if (input > 0)
    SAY();
  return 0;
}

可以看到,通过将 while 关键字中的参数设置为 0,我们可以保证整个迭代语句仅会被执行一次。而 do…while 语句“天生”需要以分号结尾的性质,也正好满足了宏函数替换后的 C 语法格式要求。并且,对于 while(0) 这种特殊的迭代形式,大多数编译器也会通过相应的优化,去掉不必要的循环控制结构,以降低对程序运行时性能的影响。

Viewpoint #

From #

09|编译准备:预处理器是怎样处理程序代码的?