在一些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-

最新文章

  1. your password has expired.to log in you must change it
  2. HDU 4757 Tree(可持久化Trie+Tarjan离线LCA)
  3. async4j 普通用法、整合spring用法
  4. apache virtualhost配置 apache配置多个网站
  5. CENTOS6 下MATLAB2014b的安装和破解(Matlab_R2014b linux版 安装笔记)
  6. Linux搭建SVN 服务器
  7. Android Studio: 我解决的DEX出错。
  8. 4542: [Hnoi2016]大数
  9. 合并多次提交 commits 到 新分支
  10. angular 实现modal windows效果(即模态窗口,半透明的遮罩层),以及bootstrap(css,components,js)的初步学习
  11. Ubuntu16.04安装GTK3主题:OSX-Arc
  12. lucene6+HanLP中文分词
  13. python科学计算_numpy_ufunc
  14. 大数据 --> ProtoBuf的使用和原理
  15. 理解Object.defineProperty函数中的get与set
  16. 端口转发 Port Forwarding (一)
  17. AlexNet详解3
  18. 盒子模型与flex模型
  19. Linux 需要掌握的一些命令
  20. Centos7 下编译 Openjdk8

热门文章

  1. 运行Xcode时,提示:An error was encountered while running (Domain = FBSOpenApplicationErrorDomain, Code = 4)
  2. SSM_CRUD新手练习(4)修改生成的mapper.xml映射文件
  3. Delphi7调用DelphiXE编写的DLL问题
  4. bash编程-Shell基础
  5. MySQL--当mysqldump --single-transaction遇到alter table(1)
  6. asp.net 增加404页面(非302、200)
  7. js中两种for循环的使用
  8. Mac下通过 brew 安装 Apache 和 PHP
  9. C#6.0语言规范(十四) 枚举
  10. I/O类型