BlackFeather'S Blog 我的技术小博 -- C/C++,Python,Golang

C++的defer

在C/C++编码中,open对close,new对delete,malloc对free等等是严格要求的,否则会有各种泄露的奇葩情况。

但是实际编码中,各种异常捕捉和错误判断又让编码变得繁琐臃肿。

后来在使用golang中,defer方法使用非常方便,C++虽然没有自带的,但是可以写嘛!

借助C++类的析构方法和lambada表达式,还有std::function容器,很容易写出来一个自己的defer(以下代码是复制来的,感觉非常的干练,自己写的不好看不贴了,后来也用了这个.h)


C++的类生存期一般是在自己所在的{}里面,退出大括号时会触发析构,通过lambada表达式将要最后执行的代码写进去,然后函数执行结束的时候触发,完美。


使用示例,非常的方便,与golang几乎一致

FILE *p = fopen("a.txt","r");
defer(if (p) fclose(p););

HANDLE hFile = CreateFile(xxx);
defer(CloseHandle(hFile));

//...



单独.h文件,引用即可使用

defer.h

#pragma once

#include <functional>

class DeferHelper
{
public:
	DeferHelper(std::function<void()> &&cb) : cb_(std::move(cb)) {}
	~DeferHelper() { if (cb_) cb_(); }
private:
	std::function<void()> cb_;
};


#define CONNECTION(text1,text2) text1##text2
#define CONNECT(text1,text2) CONNECTION(text1,text2)
#define defer(code)  DeferHelper CONNECT(L,__LINE__) ([&](){code;})



2020年9月1日 | 发布:blackfeather | 分类:C/C++代码 | 评论:0

发表留言: