作者先写过「为什么我选 Zig 不选 Rust」,这篇补上 C。他强调 C 仍是他最喜欢的语言——UNIX 的语言、K&R 一本书讲完、1990 年代的代码今天还能编译——但他不想再用 C 写新代码。全文围绕吃掉时间的琐事展开:函数要依次申请多个资源、中途失败时得逆序释放,C 的答案是 goto 加手工维护的标签顺序;Zig 用 errdefer,每个清理语句紧跟对应的分配,出错时自动逆序执行。
🔑 核心要点
错误清理从 goto 换成 errdefer 之后,不再需要手工保证标签顺序与分配顺序一致。
std.testing.FailingAllocator 能让第 N 次分配失败,于是每条失败路径都能写成测试,C 里得自己包一层 malloc。
切片自带长度,数组传参不再退化成指针加一个单独的长度参数。
立场不是语言战争:Zig 直接用 C ABI、直接调 C 库,作者反对的只是 C 里那些磨人的手工环节。
💡 金句
I am not writing this post because I think C is bad; C is my favorite programming language! I am writing it because I do not want to write new code in C any more.