在一些Linux内核和其它的开源代码中,我们常常看到像下面这样的代码:
do{ ... }while(0)
该代码片断并非轮回,这样想想好像利用do…while没有任何意义,那么为什么还要利用它呢?
实际上,do{…}while(0)的用途并不只仅是优化你的代码。颠末一系列的调研和摸索,我们总结出它的一些用途如下。
1. 辅佐界说巨大的宏以制止错误
具体表明请看“do {…} while (0) 在宏界说中的浸染”,报告了如何操作do {…} while (0) 办理常犯的宏界说错误,让各人不再恐惊宏。
2. 制止利用goto节制措施流
在一些函数中,我们在return语句之前大概需要做一些事情,好比释放在函数一开始由malloc函数申请的内存空间,利用goto老是一种简朴的要领:
int foo() { somestruct* ptr = malloc(...); dosomething...; if(error) { goto END; } dosomething...; if(error) { goto END; } dosomething...; END: free(ptr); return 0; }
但由于goto要害字大概会使代码不易读,因此很多人都不推荐利用它,那么我们可以利用do{…}while(0)来办理这一问题:
int foo() { somestruct* ptr = malloc(...); do{ dosomething...; if(error) { break; } dosomething...; if(error) { break; } dosomething...; }while(0); free(ptr); return 0; }
这里,我们利用do{…}while(0)来包括函数的主要部门,同时利用break替换goto,代码的可读性加强了。
3. 制止由宏引起的告诫
由于内核差异体系布局的限制,我们大概需要多次利用空宏。在编译的时候,这些空宏会发生告诫,为了制止这种告诫,我们可以利用do{…}while(0)来界说空宏:
#define EMPTYMICRO do{}while(0)
这样在编译的时候就不会发生告诫。
4. 界说单一的函数块来完成巨大的操纵
假如你有一个巨大的函数且你不想要建设新的函数,那么利用do{…}while(0),你可以将一些代码放在这内里并界说一些变量,这样你就不必担忧do{…}while(0)外面的变量名是否与do{…}while(0)内里的变量名沟通造成反复了。
假如你发明do{…}while(0)其它的好用途,请与我们分享哦!
From:csdn博客 lanxuezaipiao