实例1,通过do while 0定义宏
#include<stdio.h>
#define SOMETHING() do{fool1();fool2();}while(0)
void fool1(void);
void fool2(void);
void fool1(void)
{
printf("in fool1 \n");
}
void fool2(void)
{
printf("in fool2\n");
}
int main(void)
{
int a = 5;
if(a>0)
SOMETHING();
else
printf("do nothing \n");
return 0;
}
gcc编译后得到
in fool1
in fool2
解析:do后面大括号里的程序运行一次,是期望得到的。
实例2:将do while 去掉,仅通过大括号定义宏
#include<stdio.h>
#define SOMETHING() {fool1();fool2();}
void fool1(void);
void fool2(void);
void fool1(void)
{
printf("in fool1 \n");
}
void fool2(void)
{
printf("in fool2\n");
}
int main(void)
{
int a = 5;
if(a>0)
SOMETHING();
else
printf("do nothing \n");
return 0;
}
gcc 编译不过
解析:这种情况下,预编译展开后是这个样子的:
if(a>0)
{fool1();fool2();};
else
printf("do nothing \n");
相当于else前的大括号后面多了一个“;”,是不合法的。
此时,只有改成下面这样将SOMETHING()后的分号去掉才可以编译通过:
if(a>0)
SOMETHING()
else
printf("do nothing \n");
但是,一个函数语句后面不加分号,是不是怪怪的呢。
实例3,不加大括号定义宏
#include<stdio.h>
#define SOMETHING() fool1();fool2();
void fool1(void);
void fool2(void);
void fool1(void)
{
printf("in fool1 \n");
}
void fool2(void)
{
printf("in fool2\n");
}
int main(void)
{
int a = 5;
if(a>0)
SOMETHING();
else
printf("do nothing \n");
return 0;
}
编译不通过
解析:预编译展开后是这个样子的:
if(a>0)
fool1();
fool2();
else
printf("do nothing \n");
显而易见的错误。即便if 后面的条件不成立,fool2()语句也会执行。