优美的代码:do...while(0)
1、背景
最近再看一个开源代码的时候,看到很多宏经常这么写的:
#define XXX do{\
...\
}while()
一眼看到的时候就知道这一份代码执行一次,那么do...while还有什么意义呢?在查阅了很多资料之后,才发现,do...while(0)用处太多了,所以在这里总结一下。
2、总结
2.1 辅助定义多语句宏
如果我们定义下列宏:
#define DOSOMETHING()\
foo1();\
foo2();
这个宏的本意是,如果调用DOSOMETHING(),那么就执行foo1()和foo2(),但是如果你这么写:
if(xxx)
DOSOMETHING();
那么展开以后:
if(xxx)
foo1();
foo2();
不管条件是否满足,foo2()都会执行,那么程序逻辑与本意是不同的。如果采用do..while(0)则可以避免这个问题:
#define DOSOMETHING() \
do{ \
foo1();\
foo2();\
}while() if(a>)
DOSOMETHING();
...
2.2 避免使用goto
有些函数中,在函数return之前我们经常会进行一些收尾的工作,比如free掉一块函数开始malloc的内存,goto一直都是一个比较简便的方法。
int foo()
{
somestruct* ptr = malloc(...); dosomething...;
if(error)
{
goto END;
} dosomething...;
if(error)
{
goto END;
}
dosomething...; END:
free(ptr);
return ;
}
由于goto不符合软件工程的结构化,而且有可能使得代码难懂,所以很多人都不倡导使用,那这个时候就可以用do{}while(0)来进行统一的管理。
int foo()
{ somestruct* ptr = malloc(...); do{
dosomething...;
if(error)
{
break;
} dosomething...;
if(error)
{
break;
}
dosomething...;
}while(); free(ptr);
return ;
}
这里将函数主体使用do()while(0)包含起来,使用break来代替goto,后续的处理工作在while之后,就能够达到同样的效果。
2.3 避免空宏引起的warning
内核中由于不同架构的限制,很多时候会用到空宏,在编译的时候,空宏会给出warning,为了避免这样的warning,就可以使用do{}while(0)来定义空宏。
#define EMPTYMICRO do{}while(0)
优美的代码:do...while(0)的更多相关文章
- Swift - 2.3的代码到3.0的转变
		分享一下学习新语法的技巧:用Xcode8打开自己的Swift2.3的项目,选择Edit->Convert->To Current Swift Syntax- 让Xcode帮我们把Swift ... 
- 2018-10-17 Chrome插件实现GitHub代码翻译v0.0.3
		续前文浏览器插件实现GitHub代码翻译原型演示, 通过调用浏览器插件-离线英汉词典的批量查词接口, 实现了源码的初步命名直译. 源码库仍在: program-in-chinese/webextens ... 
- 基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(v6.0.0版)
		TableGo v6.0.0 版震撼发布,此次版本更新如下: 1.UI界面大改版,组件大调整,提升界面功能的可扩展性. 2.新增BeautyEye主题,界面更加清新美观,也可以通过配置切换到原生Jav ... 
- 务必收藏备用:.net core中通过Json或直接获取图形验证码(数字验证码、字母验证码、混合验证码),有源代码全实战demo(开源代码.net core3.0)
		很多人写的博客大家看了会一知半解,不知道怎么用,应该引用什么类库或者代码不全,这样很多小白很是头疼,尤其是尝新技术更是如此.我们这边不止告诉你步骤,而且还提供开源demo.随着时间的推移,我们的dem ... 
- PyTorch最佳实践,怎样才能写出一手风格优美的代码
		[摘要] PyTorch是最优秀的深度学习框架之一,它简单优雅,非常适合入门.本文将介绍PyTorch的最佳实践和代码风格都是怎样的. 虽然这是一个非官方的 PyTorch 指南,但本文总结了一年多使 ... 
- 在Asp.Net Core中配置使用MarkDown富文本编辑器实现图片上传和截图上传(开源代码.net core3.0)
		我们的富文本编辑器不能没有图片上传尤其是截图上传,下面我来教大家怎么实现MarkDown富文本编辑器截图上传和图片上传. 1.配置编辑器到html页 <div id="test-edi ... 
- VS Code Java 更新 – 全新Gradle for Java插件,更方便的代码操作, 1.0 语言支持发布
		大家好,欢迎来到 9 月版的 Visual Studio Code Java 更新.在这篇文章中,我们将分享我们最新的Gradle插件,更加方便的代码操作(Getter/Setter等等),以及最近的 ... 
- 利用js代码:document.forms[0].approval.value='false',当点击 <input type="image"按钮向表单传递不同的参数。
		<form action="flow_myTaskList"> <input type="hidden" name="approva ... 
- 代码实现Android5.0的下拉刷新效果
		如图所示,实现类似与gmail的下拉刷新. 项目地址:https://github.com/stormzhang/SwipeRefreshLayoutDemo 一.在xml文件中定义 这个控件在sup ... 
随机推荐
- jquery新版本旧版本之间的坑
			JQuery自1.6.1版本开始增加一些属性,使用时尽量使用这些新的属性,例如:selected.checked.在高版本中赋值时最好用prop,如果用attr就会出现赋值不成功的问题, 一般自定义属 ... 
- HDU 5501 The Highest Mark
			题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5501 The Highest Mark Accepts: 32 Submissions: 193 ... 
- 转 docker的下载与安装
			百度网盘下载地址:https://oomake.com/download/docker-windows 道客地址: https://link.jianshu.com/?t=https://get.da ... 
- jQuery之过滤选择器
			在原有选择器匹配的元素中进一步进行过滤的选择器 * 基本 * 内容 * 可见性 * 属性 需求 1. 选择第一个div 2. 选择最后一个class为box的元素 3. 选择所有class属性不为bo ... 
- mac下面安装Navicat Premium 12.0.24 for mac已破解中文亲测可用
			链接:https://pan.baidu.com/s/17HQ7dsCun2cSJGRpdP9yXA 密码:hwq5 Navicat_Premium_mac 最新版 12.0.24(原版是英文的) ... 
- C#获取当前路径的方法如下
			1. System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName -获取模块的完整路径. 2. System.Environm ... 
- javascript之容易出错的地方
			1: 不是所有的非空对象都有toString()方法的 var obj = Object.create(null); console.log(obj.toString()); // false; ... 
- 利用SSH secure Shell实现windows与linux之间传输文件
			在windows下安装SSH secure Shell.默认安装后有两个快捷方式. linux下需要安装openssh-server utuntu默认安装了opens是-client,所以不需要安装, ... 
- 【Java】JDBCUtil模板
			package jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; ... 
- 关于slow http attack以及apche tomcat的应对方式
			HTTP 的 Slow Attack 有着悠久历史的 HTTP DOS 攻击方式,最早大约追溯到 5 年前,按理说早该修复了,但是 Apache 的默认配置中仍然没有添加相关配置,或者他们认为这是 f ... 
