首页 > 后端开发 > Golang > 如何在不依赖 STL 或 Boost 库的情况下用 C 实现'延迟”功能?

如何在不依赖 STL 或 Boost 库的情况下用 C 实现'延迟”功能?

DDD
发布: 2024-11-01 22:32:29
原创
462 人浏览过

How can you implement a

C 中“延迟”功能的自定义实现

在 C 中,“延迟”的概念涉及在最后执行特定操作特定范围或代码块的。虽然 STL(标准模板库)和 Boost 库不提供此功能的内置实现,但可以使用以下代码片段创建自定义解决方案:

<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{} *[&amp;]()
#endif // defer</code>
登录后复制

用法:

defer 宏可以在特定范围内使用来定义在该范围结束时将执行的代码块。语法如下:

<code class="cpp">defer {
    // Code to be executed at the end of the current scope
};</code>
登录后复制

示例:

在以下示例中,在 read_entire_file 函数中使用 defer 宏,在以下情况下自动关闭输入文件:函数退出:

<code class="cpp">#include <cstdlib>
#include <cstdio>

bool read_entire_file(char *filename, std::uint8_t *&data_out, std::size_t *size_out = nullptr) {
    if (!filename)
        return false;

    auto file = std::fopen(filename, "rb");
    if (!file)
        return false;

    defer { std::fclose(file); }; // don't need to write an RAII file wrapper.

    // ... Remaining code
}</code>
登录后复制

好处:

  • 零开销:与其他一些实现不同,这种方法不会产生任何开销额外的开销。
  • 语法简洁:语法设计为易于阅读和使用。
  • 零依赖:此实现不依赖在任何外部库上,减少编译时间。
  • 灵活: defer 块可以包含任何有效的 C 语句或表达式。

注意:

  • 本地 deferrer 对象的名称以 zz_ 而不是 _ 开头,以避免命名空间污染。
  • 从技术上讲,用户标识符不应以下划线开头。

以上是如何在不依赖 STL 或 Boost 库的情况下用 C 实现'延迟”功能?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板