C 语言中的 Defer 实现
Go 风格的 defer 概念允许干净简洁的资源清理,在 C 语言中已经很流行。然而,为此功能找到标准或支持良好的库实现可能具有挑战性。
尽管标准模板库 (STL) 或 Boost 中缺乏对 defer 的内置支持,但仍有可用的外部实现。其中一个实现是轻量级、零开销的解决方案:
<code class="cpp">#ifndef defer struct defer_dummy {}; template <class F> struct deferrer { F f; ~deferrer() { f(); } }; template <class F> deferrer<F> 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</code>
此实现需要最少的设置,并且可以轻松集成到您的代码库中。语法很简单:
<code class="cpp">defer { statements; };</code>
例如,在下面的代码片段中,当退出 read_entire_file 函数的作用域时,会自动执行 fclose 操作:
<code class="cpp">auto file = std::fopen(filename, "rb"); if (!file) return false; defer { std::fclose(file); }; // don't need to write an RAII file wrapper. // ...</code>
这个零- 开销实现提供了一种方便有效的方法来管理 C 中的资源清理,提供类似 Go 的延迟功能,而不需要复杂的 RAII 类或自定义内存管理技术。
以上是如何在不牺牲性能的情况下在 C 中实现 Go 风格的延迟?的详细内容。更多信息请关注PHP中文网其他相关文章!