do{...}while(0)起飞之路

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)其他好的用处请与我分享!

发布了2 篇原创文章 · 获赞 1 · 访问量 39

猜你喜欢

转载自blog.csdn.net/u013924385/article/details/104372312
今日推荐