文档章节

C++版的defer语句

chai2010
 chai2010
发布于 2013/03/27 10:22
字数 349
阅读 834
收藏 0

<!-- C++版的defer语句 -->

Go语言有个很方便的语句defer, 具体细节参考:

一直想在C++中也能模拟类似defer的效果, 经过无数次google和尝试之后重要找到解决方法. 整理后的代码在这里:

基本的使用方法:

FILE* fp = fopen("foo.txt", "rt");
if(fp == NULL) return false;
defer([&](){ printf("fclose(fp)\n"); fclose(fp); });

char* buf = new char[1024];
defer([&](){ printf("delete buf\n"); delete[] buf; });

defer([](){ printf("defer a: %d\n", __LINE__); });
defer([](){ printf("defer a: %d\n", __LINE__); });
defer([](){ printf("defer a: %d\n", __LINE__); });

{
	defer([](){ printf("defer b: %d\n", __LINE__); });
	defer([](){ printf("defer b: %d\n", __LINE__); });
	defer([](){ printf("defer b: %d\n", __LINE__); });
}

defer([](){
	printf("defer c:\n");
	for(int i = 0; i < 3; ++i) {
		defer([&](){ defer([&](){
			printf("\ti = %d: begin\n", i);
			defer([&](){ printf("\ti = %d\n", i); });
			printf("\ti = %d: end\n", i);
		});});
	}
});

需要注意的地方:

  • defer 定义的对象在超出作用域时执行闭包函数(析构函数)
  • defer 定义的对象在同一个文件内部标识符不同(根据行号生成)
  • defer 在全局作用域使用可能会出现重名现象(行号相同)
  • defer 在判断语句使用可能提前执行(作用域结束时)
  • defer 在循环语句内使用无效(作用域结束时)
  • defer 和Go语言的defer并不完全等价

更多参考:

© 著作权归作者所有

chai2010

chai2010

粉丝 427
博文 104
码字总数 82757
作品 10
武汉
程序员
私信 提问
加载中

评论(1)

chai2010
chai2010
http://github.com/chai2010/defer
C++ STL编程轻松入门 5

2.2.3 第三版:唯美主义的杰作   事态的发展有时候总会趋向极端,这在那些唯美主义者当中犹是如此。首先声明,我并不是一个唯美主义者,提供第二版程序的改进版,完全是为了让你更深刻的感...

暖冰
2015/11/21
0
0
Go的异常处理 defer, panic, recover

Go语言追求简洁优雅,所以,Go语言不支持传统的 try…catch…finally 这种异常,因为Go语言的设计者们认为,将异常与控制结构混在一起会很容易使得代码变得混乱。因为开发者很容易滥用异常,...

blacklovebear
2014/02/09
0
0
在 C ++ 中实现 Go 的 defer 关键字

Go 有一个简洁的关键字,称为 defer,用于确保稍后在程序执行过程中执行该函数的调用,通常用于清理。 假设我们想创建一个文件,写入数据,然后在完成时将其关闭: 在使用createFile获取文件...

oschina
2017/10/23
314
0
golang捕获异常

Go语言追求简洁优雅,所以,Go语言不支持传统的 try…catch…finally 这种异常,因为Go语言的设计者们认为,将异常与控制结构混在一起会很容易使得代码变得混乱。因为开发者很容易滥用异常,...

吴之恒心
2017/03/01
0
0
AppCode 3.3 EAP 更新,Swift 2 支持

AppCode 3.3 EAP build 142.5239 发布,现已提供下载,详细改进请看更新列表。 值得关注的改进 Swift 2 支持:解析,高亮和关键字完成 支持使用 do-catch 和 try 处理错误 支持 throw 和 th...

oschina
2015/09/30
770
3

没有更多内容

加载失败,请刷新页面

加载更多

FPGA 设备 USB Platform Cable USB

lsusbFuture Technology Devices International, Ltd FT232H Single HS USB-UART/FIFO IC

MtrS
今天
4
0
lua web快速开发指南(6) - Cache、DB介绍

"数据库"与"缓存"的基本概念 数据库与缓存是服务端开发人员的必学知识点. 数据库 "数据库"是一种信息记录、存取的虚拟标记地点的集合统称. 比如现实生活中, 我们经常会用到文件柜、书桌等等数...

水果糖的小铺子
今天
7
0
Oracle分页查询语句的写法

Oracle分页查询语句的写法 Oracle分页查询语句使我们最常用的语句之一,下面就为您介绍的Oracle分页查询语句的用法,Oracle分页查询语句基本上可以按本文给出的格式来进行套用。   Oracle分...

康师傅
昨天
5
0
java并发图谱

1527
昨天
2
0
Mybatis之拦截器Interceptor

使用mybatis时用PageHelper进行分页,用到了PageInterceptor,借此了解下mybatis的interceptor。Mybatis的版本是3.4.6,MybatisHelper的版本是5.1.3。 1、PageInterceptor 先上一段代码,如下...

克虏伯
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部