理解 C 语言中的 Golang 风格的 Defer
简介:
在 C 语言中,概念延迟执行的实现,类似于 Golang 的 defer,提供了一种在特定函数返回或退出后执行代码的便捷方式。
STL 和库实现:
从 C 开始14 及更高版本,标准模板库 (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>
用法:
要使用此实现,只需将 defer 放置在函数之后要执行的代码范围之前exits:
<code class="cpp">defer { // Code to be executed after the function returns };</code>
示例:
以下示例演示如何使用此 defer 实现打开和读取文件,并在范围退出时自动关闭文件:
<code class="cpp">#include <cstdint> #include <cstdio> #include <cstdlib> bool read_entire_file(char *filename, std::uint8_t *&data_out, std::size_t *size_out = nullptr) { ... defer { std::fclose(file); }; // Automatically close the file ... }</code>
优点:
与其他方法相比,此实现提供了多个优点:
结论:
这个自定义 defer 实现提供了一种方便高效的方法来在 C 中实现延迟执行,提供与 Golang 的 defer 关键字类似的功能,而不需要自定义类或额外的依赖项。
以上是如何在 C 中实现 Golang 风格的 Defer ?的详细内容。更多信息请关注PHP中文网其他相关文章!