看到一篇文章,讲如何在 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!