C 语言中的 Defer 实现
Go 风格的 defer 概念允许干净简洁的资源清理,在 C 语言中很受欢迎。然而,为此功能找到标准或支持良好的库实现可能具有挑战性。
尽管标准模板库 (STL) 或 Boost 中缺乏对 defer 的内置支持,但仍有可用的外部实现。其中一种实现是轻量级、零开销的解决方案:
#ifndef defer
struct defer_dummy {};
template struct deferrer { F f; ~deferrer() { f(); } };
template deferrer operator*(defer_dummy, F f) { return {f}; }
#define DEFER_(LINE) zz_defer##LINE
#define DEFER(LINE) DEFER_(LINE)
#define defer auto DEFER(__LINE__) = defer_dummy{} *[&]()
#endif // defer
此实现需要最少的设置,并且可以轻松集成到您的代码库中。语法很简单:
defer { statements; };
例如,在下面的代码片段中,当退出 read_entire_file 函数的作用域时,自动执行 fclose 操作:
auto file = std::fopen(filename, "rb");
if (!file)
return false;
defer { std::fclose(file); }; // don't need to write an RAII file wrapper.
// ...
这种零开销实现提供了一种方便而有效的方法来管理 C 中的资源清理,提供类似 Go 的延迟功能,而不需要复杂的 RAII 类或自定义内存管理技术。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3