
理解 C 语言中的 Golang 风格的 Defer
简介:
在 C 语言中,概念延迟执行的实现,类似于 Golang 的 defer,提供了一种在特定函数返回或退出后执行代码的便捷方式。
STL 和库实现:
从 C 开始14 及更高版本,标准模板库 (STL) 或其他库(如 Boost)不提供延迟执行模式的直接实现。但是,有几个第三方库和技术可用于实现此功能。
自定义实现:
提供的代码片段提供了零开销、简单的- defer 的使用实现:
1 2 3 4 5 6 7 8 | <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 放置在函数之后要执行的代码范围之前exits:
1 2 3 | <code class = "cpp" >defer {
};</code>
|
登录后复制
示例:
以下示例演示如何使用此 defer 实现打开和读取文件,并在范围退出时自动关闭文件:
1 2 3 4 5 6 7 8 9 10 11 12 | <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); };
...
}</code>
|
登录后复制
优点:
与其他方法相比,此实现提供了多个优点:
- 零开销,无需任何额外的运行时间开销
- 语法更简单,更容易使用
- 零依赖,减少编译时间
- 可以轻松粘贴到代码库中的任何位置
结论:
这个自定义 defer 实现提供了一种方便高效的方法来在 C 中实现延迟执行,提供与 Golang 的 defer 关键字类似的功能,而不需要自定义类或额外的依赖项。
以上是如何在 C 中实现 Golang 风格的 Defer ?的详细内容。更多信息请关注PHP中文网其他相关文章!