do {...} while (0) 的用途汇总(欢迎补充)
在一些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)其它的好用途,请与我们分享哦!
编译自:http://www.pixelstech.net/article/1350871981-Significance-and-use-of-do%7B-%7Dwhile%280%29-
最新文章
- your password has expired.to log in you must change it
- HDU 4757 Tree(可持久化Trie+Tarjan离线LCA)
- async4j 普通用法、整合spring用法
- apache virtualhost配置 apache配置多个网站
- CENTOS6 下MATLAB2014b的安装和破解(Matlab_R2014b linux版 安装笔记)
- Linux搭建SVN 服务器
- Android Studio: 我解决的DEX出错。
- 4542: [Hnoi2016]大数
- 合并多次提交 commits 到 新分支
- angular 实现modal windows效果(即模态窗口,半透明的遮罩层),以及bootstrap(css,components,js)的初步学习
- Ubuntu16.04安装GTK3主题:OSX-Arc
- lucene6+HanLP中文分词
- python科学计算_numpy_ufunc
- 大数据 -->; ProtoBuf的使用和原理
- 理解Object.defineProperty函数中的get与set
- 端口转发 Port Forwarding (一)
- AlexNet详解3
- 盒子模型与flex模型
- Linux 需要掌握的一些命令
- Centos7 下编译 Openjdk8
热门文章
- 运行Xcode时,提示:An error was encountered while running (Domain = FBSOpenApplicationErrorDomain, Code = 4)
- SSM_CRUD新手练习(4)修改生成的mapper.xml映射文件
- Delphi7调用DelphiXE编写的DLL问题
- bash编程-Shell基础
- MySQL--当mysqldump --single-transaction遇到alter table(1)
- asp.net 增加404页面(非302、200)
- js中两种for循环的使用
- Mac下通过 brew 安装 Apache 和 PHP
- C#6.0语言规范(十四) 枚举
- I/O类型