如何使用C语言中的20 co_yield关键字实现协程生成器?

2026-04-30 19:530阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1030个文字,预计阅读时间需要5分钟。

如何使用C语言中的20 co_yield关键字实现协程生成器?

直接说结论:

为什么 co_yield 单独写就编译不过

常见错误是这样写:

int fibonacci() { int a = 0, b = 1; while (true) { co_yield a; // ❌ 编译报错:'co_yield' cannot be used in a non-coroutine function int tmp = a; a = b; b += tmp; } }

原因很直接:co_yield 只能在协程函数里用,而协程函数的判定规则是:

  • 函数体中至少出现一次 co_yieldco_awaitco_return
  • 返回类型必须定义嵌套的 promise_type,且该类型满足协程 traits(如提供 get_return_objectinitial_suspend 等)
  • 返回类型不能是 intvoidstd::vector<T> 这类“普通”类型

换句话说,co_yield 不是语法糖,它是协程状态机的触发器,没有配套的 promise 和 handle,它连编译都过不了。

阅读全文
标签:C

本文共计1030个文字,预计阅读时间需要5分钟。

如何使用C语言中的20 co_yield关键字实现协程生成器?

直接说结论:

为什么 co_yield 单独写就编译不过

常见错误是这样写:

int fibonacci() { int a = 0, b = 1; while (true) { co_yield a; // ❌ 编译报错:'co_yield' cannot be used in a non-coroutine function int tmp = a; a = b; b += tmp; } }

原因很直接:co_yield 只能在协程函数里用,而协程函数的判定规则是:

  • 函数体中至少出现一次 co_yieldco_awaitco_return
  • 返回类型必须定义嵌套的 promise_type,且该类型满足协程 traits(如提供 get_return_objectinitial_suspend 等)
  • 返回类型不能是 intvoidstd::vector<T> 这类“普通”类型

换句话说,co_yield 不是语法糖,它是协程状态机的触发器,没有配套的 promise 和 handle,它连编译都过不了。

阅读全文
标签:C