天天看点

c++ 实现defer

看到一篇文章,讲如何在 Objective-C 的环境下实现 defer,深受启发。所以在c++下实现了一个版本,效果还不错。

// 用于定义一个匿名变量名,把行号放到变量名中
#define  __ANONYMOUS1(type, var, line)  type  var##line
#define  _ANONYMOUS0(type, line)  __ANONYMOUS1(type, _anonymous, line)
#define  ANONYMOUS(type)  _ANONYMOUS0(type, __LINE__)

// defer所执行的函数的类型
typedef std::function<void()> __DeferFunc;
void __deferCleanUp(__DeferFunc* func)
{
	(*func)();
}

#define defer \
	__DeferFunc deferCleanUp_##__LINE__ __attribute__((cleanup(__deferCleanUp), unused)) =

void test()
{
	cout << "call the test func!" << endl;
}

int main() {
	if (true)
	{
		// 可以用匿名函数做defer
		defer [](){
			cout<<"will out if block!" << endl;
		};

		// 也可以用普通函数做defer
		defer test;
		cout << "in if block!" << endl;
	}
}

输出结果:
in if block!
call the test func!
will out if block!