为什么在用宏定义的时候必须使用do{}while(0)
语句
答:
- 首先看一下错误案例
#include <stdio.h>
#define abs(x) baz(x);bar(x) //目的就是想让后面这两个语句都能被执行
void baz(int x)
{
printf("BAZ被执行\n");
}
void bar(int x)
{
printf("BAR被执行\n");
}
int main()
{
//abs(3);//正常执行
if(0)//这里你看你不想执行宏定义abs的任何语句,但是他依然执行了bar,显然是错误的
abs(3);
return 0;
}
- 运行结果如下
使用do {} while(0)
去解决上述问题
#include <stdio.h>
//#define abs(x) baz(x);bar(x) //目的就是想让后面这两个语句都能被执行
#define abs(x) do{baz(x);bar(x);}while (0)
//目的就是想让后面这两个语句都能被执行
void baz(int x)
{
printf("BAZ被执行\n");
}
void bar(int x)
{
printf("BAR被执行\n");
}
int main()
{
//abs(3);//正常执行
if(0)//用了do while(0)就能保证bar不能被执行
abs(3);
return 0;
}
- 运行结果如下
- 或许你想用大括号去宏定义,想法是可以但是会报错
#include <stdio.h>
//#define abs(x) baz(x);bar(x) //目的就是想让后面这两个语句都能被执行
//#define abs(x) do{baz(x);bar(x);}while (0)
#define abs(x) {baz(x);bar(x);}
//目的就是想让后面这两个语句都能被执行
void baz(int x)
{
printf("BAZ被执行\n");
}
void bar(int x)
{
printf("BAR被执行\n");
}
int main()
{
//abs(3);//正常执行
if(0)//如果用大括号的话,这个else就不能使用,就会报错
abs(3);
else //报错不能被使用
printf ("你干嘛哈哈哎哟");
return 0;
}
- 运行结果如下
总结
- 用
do {.....} while(0)
能够解决很多报错问题,还能不影响上下文的代码,相当于是一个模块代码,类似大括号的作用,用在宏定义
和if else
语句比较合适,不过你不用担心代码冗杂,因为这种只执行一次循环的代码会被大多数编译器自动优化,不会降低代码运行效率。