文档章节

C++版的defer语句

chai2010
 chai2010
发布于 2013/03/27 10:22
字数 349
阅读 767
收藏 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

粉丝 417
博文 99
码字总数 81569
作品 10
武汉
程序员
加载中

评论(1)

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

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

暖冰
2015/11/21
0
0
C/C++之C及C++发展史及标准

Tips:  1. 本人当初学习C/C++的记录。  2. 资源很多都是来自网上的,如有版权请及时告知!  3. 可能会有些错误。如果看到,希望能指出,以此共勉! C和C++   C++是C语言的一个超集。C...

zcshoucsdn
2017/03/06
0
0
C语言/C++编程学习:程序结构:构思

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到...

小辰带你看世界
05/11
0
0
C语言编程学习程序解析:控制语句之while循环语句详解

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到...

小辰带你看世界
05/28
0
0
《C++ primer》读后感:时代的经典

说起Lippman的C++ Primer,我总是有种特殊感情。这本书既是我进入C++领域的敲门砖,也是我第一次在网络上发表技术文章的对象。当年读书笔记中的青涩迷惘和年少轻狂都还历历在目,转眼已经从第...

凌杰_owlman
05/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Confluence 6 Windows 中以服务方式自动重启的原因

针对长时间使用的 Confluence,我们推荐你配置 Confluence 自动随操作系统重启而启动。针对一些 Windows 的服务器,这意味着需要让 Confluence 以服务的方式运行。 有下面 2 种方式来以服务的...

honeymose
40分钟前
2
0
day93-20180920-英语流利阅读-待学习

时尚之觞:外表光鲜靓丽,其实穷得要命 Lala 2018-09-20 1.今日导读 讲到时尚界,我们脑海里浮现的可能都是模特和设计师光鲜靓丽、从容潇洒的模样。可是,最近在法国出版的一本书却颠覆了我们...

飞鱼说编程
58分钟前
3
0
maven的pom.xml用解决版本问题

maven管理库依赖,有个好处就是连同库的依赖的全部jar文件一起下载,免去手工添加的麻烦,但同时也带来了同一个jar会被下载了不同版本的问题,好在pom的配置里面允许用<exclusion>来排除一些...

JAVA码猿
今天
1
0
20180920 rzsz传输文件、用户和用户组相关配置文件与管理

利用rz、sz实现Linux与Windows互传文件 [root@centos01 ~]# yum install -y lrzsz # 安装工具sz test.txt # 弹出对话框,传递到选择的路径下rz # 回车后,会从对话框中选择对应的文件传递...

野雪球
今天
2
0
OSChina 周四乱弹 —— 毒蛇当辣条

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ 达尔文:分享花澤香菜/前野智昭/小野大輔/井上喜久子的单曲《ミッション! 健?康?第?イチ》 《ミッション! 健?康?第?イチ》- 花澤香菜/前野智...

小小编辑
今天
382
18

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部