do{
...
}while(0);
do{…}while(0)的用途并不仅仅是优化你的代码。经过一系列的调研和探索,我们总结出它的一些用途如下。
1.帮助定义复杂的宏
举例如下:
#define __set_task_state(tsk, state_value) \
do { (tsk)->state = (state_value); } while (0)
使用do{…}while(0)构造后的宏定义不会受到大括号、分号等的影响,总是会按你期望的方式调用运行。
这里你可能感到迷惑不解了,为什么不用大括号直接把宏包围起来呢?为什么非得使用do/while(0)逻辑呢?
例如,我们用大括号来定义宏如下:
#define foo(x) { bar(x); baz(x); }
这对于上面举的if语句的确能被正确扩展,但是如果我们有下面的语句调用呢:
if (!feral)
foo(wolf);
else
bin(wolf);
宏扩展后将变成:
if (!feral) {
bar(wolf);
baz(wolf);
};
else
bin(wolf);
大家可以看出,这就有语法错误了。
2.避免使用控制程序流
不多说直接上代码
char* Data = nullptr;
Data = (char*)malloc(2048);
do{
...
if(error)
break;
...
if(error)
break;
...
}while(0);
if(Data)
free(Data);
Data = nullptr;
3.避免单一函数块完成复杂的操作
如果你有一个复杂的函数且你不想要创建新的函数,那么使用do{…}while(0),你可以将一些代码放在这里面并定义一些变量,这样你就不必担心do{…}while(0)外面的变量名是否与do{…}while(0)里面的变量名相同造成重复了。
//刷卡器
do{
...
}while(0);
//接触式读卡器
do{
...
}while(0);
//二代证
do{
...
}while(0);
如果发现do{…}while(0)其他好的用处请与我分享!