即将发布的C库STC v4.3已支持块定义风格的协程

67 篇文章 1 订阅

新版STC将支持如下Block-style的协程(Coroutine)定义:

cco_routine (ctx) {
    puts("1");
    cco_yield(1);
    puts("2");
    cco_yield(2);
    puts("3");
    cco_yield(3);
}
puts("ending");
return -99;

https://github.com/stclib/STC/pull/57

而在此之前,用的是相对丑陋的配对的cco_begin(ctx) cco_end(ret)

cco_begin(ctx);
    puts("1");
    cco_yield(1);
    puts("2");
    cco_yield(2);
    puts("3");
    cco_yield(3);
cco_end(-99);

相比旧版,新版写法浑然天成,风格上更贴近C语言,摒弃了原来人为刻意构造的 cco_begin/cco_end,把返回值也从cco_end参数里拿出来,用纯粹的C语法return表达协程返回值,而且还额外支持在协程结束之前执行任意代码,这也是相对旧版的重要改进。

为了支持新版写法,我花费了不少心思,灵活运用和借鉴了达夫设备思想,把 case n: 写在 case 0: 后面的花括号内,外面再套一个for循环,内部实现的确是反常规的另类思路,但体现到外部API上却又十分优雅自然。我的 PR 得到 stclib 作者 Tyge Løvset (tylov) 的充分肯定,并三番四次对我表示感谢,甚至还特意在后续 commit 中在源代码里点名感谢我。数周之后 tylov 依然念念不忘

Btw, I am still in awe over your previous pull request! I had no idea it was possible to have the first switch case outside the block, which allowed this. Thanks again!!


Tyge Løvset 开发的 STC 库深受我的喜爱(没有之一),我关注这个项目超过两年,可以说是见证了它从诞生初期到逐步发展壮大的全过程。STC库主要提供规范的跨平台的高性能的类型安全的泛型数据结构,其作者 tylov 把C语言的宏运用的深入浅出,代码固然艰深难读,但其对外提供的API却既优雅又友好。在许多年前,我曾经特别反感和排斥这样的大量使用宏的C语言库,甚至一度躺平情愿接受更繁琐的写法,后来逐步碰壁反思,我才逐渐意识到,除非大量的宏运用,很难在C库中提供优雅而类型的API接口,这业已成为行业共识。很多东西如果你不做到自动化规范化,反而要求C库使用者时刻记忆遵守某些铁规,是不太现实的,因为不断地犯错是写在人性之中的。

STC is a modern, typesafe, fast and compact container and algorithms library for C99. The API naming is similar to C++ STL, but it takes inspiration from Rust and Python as well. The library handles everything from trivial to highly complex data using templates.


在接触到 STC 之前,我还考察过 klib, zpl, mlib, tbox 等,印象中 mlib 对宏的运用更加走火入魔让人避而远之,相对来说 stclib 还是比较克制的。

mlib (MLib, MStarLib) 这个C语言库把宏(Macro)运用到极致,其中OPLIST是其创新之精华("An OPLIST is a fundamental notion of MLIB that hasn’t be used in any other library.")。对外,它提供了丰富实用的泛型数据结构及其文档和测试用例;在内部,它大量使用各种宏技巧,无所不用其极,例如m-core.h在编译时计算宏参数个数是否为1。初看是作者炫耀奇技淫巧,仔细想想要实现泛型的优雅的C语言数据结构,往往也只能用宏(参考)。所以我认为,它的实用性值得使用,它的技巧值得学习。

可后来遇到STC之后,瞬间觉得mlib不香了,mlib的实现代码过于复杂,而stc要简洁很多。当时的stc还是下面这种接口:

using_cvec(i, int);
cvec_i vec = cvec_i_init();

当时一见如故。后来历经多次大的改版,API早已不是这个样子。至今依然喜爱STC。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
另外一种风格STC15系列函数与例程测试版v1.0是一款为STC15系列单片机设计的新函数和例程版本。该版本在原有的函数和例程基础上进行了优化和改进,以提高代码的效率和可靠性。 首先,该版本的函数和例程在结构上进行了重新组织,使得代码更加清晰和易于理解。每个功能模都被封装成一个独立的函数,以便于调用和管理。同时,函数之间的关系也更加明确,使得程序的流程更加清晰。 其次,该版本的函数和例程对API接口进行了调整和优化,以提供更加全面和丰富的功能。例如,IO口控制、定时器功能、中断处理等方面都进行了改进,使得用户能够更加方便地使用这些功能,并能够进行更加复杂的操作。同时,对异常情况和错误处理也进行了考虑,增强了程序的稳定性和可靠性。 此外,该版本的函数和例程还新增了一些常用的功能模,如串口通讯、ADC采样、PWM控制等,以满足用户的多样化需求。这些新增模在设计上考虑了扩展性和灵活性,使得用户能够根据自己的需求进行修改和定制,以适应不同的应用场景。 综上所述,另外一种风格STC15系列函数与例程测试版v1.0是一款对原有函数和例程进行了改进和优化的版本。通过重新组织代码结构、优化API接口、新增常用功能模等方式,使得函数和例程更加高效、可靠、易用,能够满足用户的不同需求。用户可以根据该版本进行开发和调试,以获得更好的开发体验和性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值