跳转至

高级主题 — comptime、线程与 C 互操作

这一章把 Zig 从「语言」升级为「世界观」,三件事:comptime(编译期即主场)、 线程(裸 OS 并发,无托儿所)、C 互操作(ABI 是共同语法,双向调用)。 原书定位:入门概览,每个主题「够你认出全貌、激起深挖的欲望」,不是终局教材。

1. 这一章讲什么

链条位置:前面所有章节的「编译期」线索(第 4 章 inline for、第 8 章 anytype、 第 11 章构建选项)在这里收拢成系统知识;线程和 C 互操作则是系统级语言的两张 「出门证」。读完你能:读懂标准库泛型容器的实现思路、写出有保护的并发计数器、 在 Zig 里调 C 函数。

2. 顶层全景

  comptime  编译期(树遍历解释器,能操作类型)vs 运行期(原生机器码)
            type 是编译期值 → type function 返回类型 → 泛型的真身
            反射三件套:@TypeOf / @typeInfo / @Type
            anytype = 鸭子类型占位符;五个常见错误有标准解法
  线程      spawn/join;Mutex(保镖)vs atomic(猎豹);三个坑:竞争/死锁/生命周期
  C 互操作  ABI 语法书;@cImport 进、export+callconv(.C) 出;
            extern struct 对齐布局;[*c]T 是危险品

  图说:三块彼此独立,共享同一个词——「显式」。

主线例子(comptime 区):编译期素数表——generatePrimes(10000) 在编译期跑完, 产物直接烤进二进制,运行时零成本;代价是撞默认「分支配额」,要 @setEvalBranchQuota 显式加预算1。

3. comptime:时间机器

3.1 基本动作

comptime 表达式 强制在编译期求值;comptime { ... } 是编译期块; comptime 参数 把「这个值必须编译期已知」写进函数签名。 经典收益三件套:预计算(comptime complex_calculation(1234) 把结果烤进二进制)、 编译期断言(comptime { assert(array_size > 0) }——不过就编不过)、 编译期报错(@compileError("x must be non-negative")——签名级的参数校验)2。 comptime_int 是特殊的无限精度整数类型:无固定大小、可强转成任何整数/浮点, 但只能在编译期用——const my_number = 1234; 推断出来就是它3。

3.2 双重身份:两部 Zig

原书的核心图景,照单接住4:

编译期 Zig 运行期 Zig
执行者 树遍历解释器(逐分支分析) 原生机器码
能做什么 操纵类型、复杂计算、约束校验 跑得快、碰硬件、响应外部事件
像什么 带静态类型安全的动态脚本语言 真正的系统语言

黄金法则:comptime 函数的所有参数必须编译期已知—— factorial(5) 行(5 是常量),factorial(user_input) 不行(运行期值)5。

3.3 type 与 type function:泛型的真身

type 是一个特殊的编译期值:它代表类型本身,不能当运行期值用。 原书给了三条「为什么只允许编译期」的理由:类型相关操作全部在编译期解析, 杜绝运行期类型错误;编译期代码会被优化掉,二进制更瘦;编译期代码和运行期 代码一眼可分,清晰度有保33。 用它做参数,函数就能「返回类型」:

  fn FixedArray(comptime T: type, comptime size: usize) type {
      return [size]T;                       // 返回一个数组类型
  }
  const IntArray5 = FixedArray(i32, 5);     // = [5]i32,是一个类型

这就是 Zig 泛型的全部机制——没有 generics 关键字,type function 就是泛型。 std.ArrayList 本身就是一个 type function(收一个元素类型,返回一个列表类型)6。 原书的 Pair(T) 例子还示范了「type function 返回的结构体可以自带方法」7。

反射三件套:@TypeOf(表达式) 问类型(多参数时返回 peer type); @typeInfo(T) 拿类型的结构化元数据(std.builtin.Type 标签联合,可查 「它是不是整数、有哪些字段」);@Type(元数据) 反向构造类型—— 原书的例子把 i32 的位宽加 8,造出一个 i408。 三者合用的顶点:generateStruct(字段名数组, 字段类型数组) 在编译期 凭空拼出一个结构体类型——数据库模型、API 响应体可以不用手写9。

3.4 anytype:鸭子类型占位符

fn add(a: anytype, b: anytype) @TypeOf(a)——类型检查推迟到调用点: 你对参数做的操作(这里是 +)就是它的隐式接口,编译器在每个调用处单独验证。 这叫鸭子类型(「能像鸭子叫就当鸭子用」),但检查发生在编译期,不是运行期10。 anytype 只能用于函数参数(它不是真类型,不能声明变量)11。

原书列了五个地雷及标准排法,两个最值钱的:

  1. 该用 type 的地方用 anytype(比如 comptime T: anytype 再当类型用)—— 记住:要「操纵类型本身」用 type,要「接受任何值」用 anytype;
  2. 按类型做运行期分支(if (T == i32))——类型信息只存在于编译期, 正解是 switch (@TypeOf(value)) { i32 => ..., else => @compileError(...) }12。

3.5 主线例子:编译期素数表与分支配额

  const prime_lookup_table = comptime blk: {
      @setEvalBranchQuota(50000);            // 显式提高编译期「预算」
      break :blk generatePrimes(10000);      // 编译期跑完筛法,结果进二进制
  };

分支配额(evaluation branch quota) 是编译器的断路器:一个 comptime 块里 循环和递归的「回跳次数」有上限,超限报错 evaluation branch quota reached—— 没有它,一个写错的 comptime 死循环会冻结编译器本身13。 @setEvalBranchQuota 只对所在作用域生效(局部的、显式的,一贯的 Zig 哲学), 而且「你几乎不会主动用它——是编译器报配额错时你才来调」14。

4. 线程:裸的,才是真的

4.1 spawn 与 join

std.Thread.spawn(.{}, func, .{参数}) 起线程;join() 等它结束—— 不 join,主线程可能先行退出,子线程半途成为野线程15。

4.2 共享数据:Mutex 与 atomic

两班岗的分工(原书比喻精准):

std.Thread.Mutex(保镖) std.atomic.Value(猎豹)
保护什么 复杂共享结构(链表、树)、多步复合操作 简单独立变量(计数器、标志)
怎么做 lock → 操作 → unlock(defer 保底) 原子指令直接改,不阻塞
开销 大(线程挂起/唤醒) 小

Mutex 例:lock(); defer unlock(); counter += 1;——unlock 用 defer 兜底, panic 也不留锁16。atomic 例:counter.fetchAdd(1, .seq_cst), .seq_cst(顺序一致性)保证所有线程看到一个全序17。

4.3 三个坑与线程池

原书的排障三咒18:

  1. 数据竞争——两线程抢同一数据没裁判;解法:共享数据一律 mutex,没有例外;
  2. 死锁——A 拿着 B 的锁、B 拿着 A 的锁,对峙;解法:全局锁序,永远按同一顺序上锁;
  3. 生命周期——线程还在用,数据已被 free;解法:父线程 join 完再清理, 「你分配的,你参加它的葬礼」。

性能面:裸线程不免费,多了会撑爆系统;线程池——固定 N 个工人循环接任务, 原书给了 5 工人跑 10 任务的批处理示例(输出顺序不定,正是并发的本色)19。

5. C 互操作:共同的语法是 ABI

5.1 ABI:二进制层的语法书

ABI(应用二进制接口) 规定:数据在内存里的排布(大小、对齐、偏移)、 符号命名、函数调用的约定(参数怎么传、栈谁清)。稳定的 ABI 让「不同编译器、 不同机器上分别编译」的库和可执行文件能一起工作——这是一切 FFI (外部函数接口)的地基。Zig 内部不用稳定 ABI,但它的 extern 声明借 C 的 ABI, 所以对 C(以及所有和 C 打过交道的语言)说一口流利的「C ABI」20。

5.2 Zig 调 C:@cImport

  const c = @cImport({
      @cInclude("stdio.h");
      @cInclude("time.h");
  });

  pub fn main() void {
      _ = c.printf("Zig says: Hello from C's %s!\n", "printf");
      ...
  }

@cImport 是「C 头文件的巴别鱼」:喂它头文件,它吐出 Zig 声明, c.printf 像原生 Zig 一样调21。因为用了 libc,编译要 -lc (zig run -lc cimport.zig);走构建系统则在 build.zig 里 exe.linkLibC()22。 三个配套内建:@cInclude(加头文件)、@cDefine/@cUndef(定义/取消宏)。 看不动一段 C?zig translate-c 把 C 源码翻成(大致可读的) Zig—— 罗塞塔石碑,理解 C 代码的起点23。

5.3 C 调 Zig:export + callconv(.C)

  export fn count_words(str: [*:0]const u8) callconv(.C) u32 { ... }

三个部件各管一件事:export(第 5 章的名字)让函数对外可见; callconv(.C) 让 Zig 按 C 的调用约定传参——忘了它就是烟花秀: Zig 默认用自己的调用约定,C 听不懂24; [*:0]const u8 是哨兵终止的多项指针,精确表达「C 风格字符串,以 0 结尾」, 比 C 的 char* 多一层类型保证25。C 侧照常 extern uint32_t count_words(const char *str); 声明后直调26。

5.4 布局外交:extern struct、对齐、packed

普通 Zig struct 的内存布局听编译器的(字段可能重排);和 C 交换数据必须用 extern struct——向 C 的 ABI 布局规则宣誓效忠,否则字段错位就是 国际事件27。对齐是 CPU 的挑食:4 字节类型喜欢待在 4 的倍数地址, 喂错了轻则慢、重则崩;Zig 用 align 关键字定制28。 packed struct(第 8 章见过)在这里补完了动机:普通结构体为对齐塞 padding(u8 + u32 可能占 8 字节而不是 5),packed 把 padding 全删掉、 逐位压缩——网络协议和硬件接口的刚需,代价是非对齐访问的罚金和偶发的编译器 bug29。

packed 世界里还有一把配套钥匙:bit-aligned pointer。字段按位压缩后, 「指针按字节对齐」的默认假设失效,要精确访问某个逐位字段(比如 packed struct 里的单个 bool),得靠 bit 对齐的指针按 bit 偏移导航——原书把它比作 专用开锁器,没有它,从紧紧打包的字节流里抠单个 bit 就是摸黑操作;原书列的 低层编程黄金规则里专门有一条「掌握 bit-aligned pointer」34。

5.5 [*c]T:几乎不该碰的指针

C 指针 [*c]T 的四大乱象:不在乎对齐、可以是空(null)、可以和整数随意互转、 可强转成其他指针——每一样都在拆 Zig 指针安全的台。它存在的唯一正当理由: 翻译 C 代码时必须匹配 C 的指针语义。结论(原书):自动翻译产物之外, 「几乎永远不要在 Zig 代码里直接用 [*c]T」;必须和 C 裸指针打交道时, 尽快转成 *T/[*]T/[]T 并补上 null 与对齐检查30。

判断(我们的,不是书里的): 这一节的实用读法是「翻译层是脏的,尽快洗干净」。 和 Rust 的 FFI 哲学( unsafe 块要最小化、封装成安全 API)同构—— Zig 只是没有 unsafe 关键字把脏区标出来,责任全在约定。 好消息是工具链帮你:@cImport 生成的声明集中在一点,洗手池就在那里。 如果错,会错在: 某些 C 头文件的宏和位域翻不过去,@cImport 会静默给出 近似物——翻译结果要抽验,不能全信。

荣誉提名:zig cc / zig c++——不只是 Clang 的包装,集成进构建系统和缓存, 单装一个 Zig 就能给 C/C++ 做全平台交叉编译31。第 1 章「Maintain with Zig」 的硬件,到这里齐了。

6. 作者的判断与证据

可核的: 全部 API 与输出(素数表、线程池输出顺序不定、C 互操作两端代码)、 五个 anytype 地雷的报错形态、[*c]T 的四大性质11930。

立场: 「comptime 是哲学不是特性」14;线程一节明说这是「概览, 深挖要另开一本书」;C 一节对三家语言的比喻(Rust 拆迁、Python 转租、 Zig 翻新)是作者立场鲜明的类比,不是中立测评——但「Zig 走增量互操作」 的事实判断与第 1 章一致。

7. 边界与局限

缺什么 说明
comptime 的字面量/容器操作没系统讲 ++、.{}、字符串操作在 comptime 的完整能力,没列表
线程没有讲条件变量、channel Condition、std.event(当时实验性)缺席;并发原语只有 mutex 和 atomic
async/await 完全没提 写作时 Zig 的 async 处于被移除后重做阶段,原书避开了这个雷区——读者要知道这门课在外面还欠着
C 互操作没讲 build.zig 里链 C 库全流程 addCSourceFile、addLibraryPath 等只在别处一闪而过
@cImport 的失败模式没讲 宏/位域翻译的限制、何时必须手写 extern 声明
全部没有练习(除指向仓库的指针) 本章的「practice makes perfect」只是指路到 GitHub 的泛型 Stack 教程32

8. 可带走的

主线例子一行: comptime { @setEvalBranchQuota(50000); break :blk generatePrimes(10000); } —— 编译期跑完重活,零运行时成本,预算撞墙就显式加。

  1. comptime 三件事:预计算、编译期断言、@compileError 参数校验; comptime_int 是只活在编译期的无限精度整数;
  2. 双重身份:编译期是树遍历解释器(能操纵类型),运行期是原生机器码; comptime 函数的所有参数必须编译期已知;
  3. 泛型 = type function:fn Foo(comptime T: type) type; std.ArrayList 就是;type 是编译期值,不能当运行期值;
  4. 反射三件套:@TypeOf(问)、@typeInfo(拆)、@Type(造); 合用可编译期拼出结构体;
  5. anytype = 鸭子类型 + 编译期检查;只用于参数; 按类型分支用 comptime switch,别用运行期 if;
  6. 分支配额是编译器断路器;@setEvalBranchQuota 局部加预算, 编译器报配额错时才用;
  7. 线程:spawn 后必须 join;Mutex 护复杂结构、atomic 管简单计数; 三坑:竞争(mutex 无例外)、死锁(全局锁序)、生命周期(join 完再清理); 线程池节制资源;
  8. C 互操作:ABI 是共同语法;@cImport 进、export fn + callconv(.C) 出; extern struct 对齐 C 布局;packed 逐位压缩;[*c]T 是危险品,尽快洗掉;
  9. zig cc/zig c++ 顺手就是全平台 C/C++ 交叉编译器;
  10. 本章是概览:async、条件变量、cImport 的坑,都是「出了这本书要补的课」。

9. 原文地图

主题 原书章 原文位置
comptime 基础与 comptime_int Chapter 12: Sophisticated Topics text/20-ch12-chapter-12-sophisticated-topics.txt:45(搜「duct tape」) · text/20-ch12-chapter-12-sophisticated-topics.txt:70(搜「inferred to be」)
comptime 块与 @compileError Chapter 12: Sophisticated Topics text/20-ch12-chapter-12-sophisticated-topics.txt:107(搜「comptime {」) · text/20-ch12-chapter-12-sophisticated-topics.txt:125(搜「@compileError」)
双重身份(树遍历解释器) Chapter 12: Sophisticated Topics text/20-ch12-chapter-12-sophisticated-topics.txt:169(搜「tree-walking」)
黄金法则 Chapter 12: Sophisticated Topics text/20-ch12-chapter-12-sophisticated-topics.txt:203(搜「golden rule」)
type 超类型 Chapter 12: Sophisticated Topics text/20-ch12-chapter-12-sophisticated-topics.txt:237(搜「meta-type」)
type function(FixedArray/Pair) Chapter 12: Sophisticated Topics text/20-ch12-chapter-12-sophisticated-topics.txt:271(搜「FixedArray」) · text/20-ch12-chapter-12-sophisticated-topics.txt:295(搜「Pair」) · text/20-ch12-chapter-12-sophisticated-topics.txt:336(搜「ArrayList type is a type function」)
反射三件套 Chapter 12: Sophisticated Topics text/20-ch12-chapter-12-sophisticated-topics.txt:351(搜「@TypeOf: The detective」) · text/20-ch12-chapter-12-sophisticated-topics.txt:377(搜「@typeInfo(i32)」) · text/20-ch12-chapter-12-sophisticated-topics.txt:410(搜「i40」)
generateStruct Chapter 12: Sophisticated Topics text/20-ch12-chapter-12-sophisticated-topics.txt:426(搜「generateStruct」)
anytype 与鸭子类型 Chapter 12: Sophisticated Topics text/20-ch12-chapter-12-sophisticated-topics.txt:481(搜「Swiss Army knife」) · text/20-ch12-chapter-12-sophisticated-topics.txt:496(搜「Duck typing」)
五个地雷 Chapter 12: Sophisticated Topics text/20-ch12-chapter-12-sophisticated-topics.txt:521(搜「Mistake 1」) · text/20-ch12-chapter-12-sophisticated-topics.txt:574(搜「processValueBetter」) · text/20-ch12-chapter-12-sophisticated-topics.txt:584(搜「everything should be anytype」)
分支配额 Chapter 12: Sophisticated Topics text/20-ch12-chapter-12-sophisticated-topics.txt:706(搜「circuit breaker」) · text/20-ch12-chapter-12-sophisticated-topics.txt:747(搜「@setEvalBranchQuota(50000)」)
spawn/join Chapter 12: Sophisticated Topics text/20-ch12-chapter-12-sophisticated-topics.txt:792(搜「std.Thread.spawn」) · text/20-ch12-chapter-12-sophisticated-topics.txt:795(搜「thread.join」)
Mutex 与 atomic Chapter 12: Sophisticated Topics text/20-ch12-chapter-12-sophisticated-topics.txt:825(搜「bouncer of your nightclub」) · text/20-ch12-chapter-12-sophisticated-topics.txt:882(搜「fetchAdd」)
并发三坑 Chapter 12: Sophisticated Topics text/20-ch12-chapter-12-sophisticated-topics.txt:920(搜「Data race」) · text/20-ch12-chapter-12-sophisticated-topics.txt:926(搜「Deadlock」) · text/20-ch12-chapter-12-sophisticated-topics.txt:933(搜「Lifetime issues」)
线程池 Chapter 12: Sophisticated Topics text/20-ch12-chapter-12-sophisticated-topics.txt:960(搜「num_workers = 5」)
ABI 定义 Chapter 12: Sophisticated Topics text/20-ch12-chapter-12-sophisticated-topics.txt:1050(搜「rulebook」)
@cImport 与 -lc Chapter 12: Sophisticated Topics text/20-ch12-chapter-12-sophisticated-topics.txt:1067(搜「cImport」) · text/20-ch12-chapter-12-sophisticated-topics.txt:1099(搜「-lc」)
translate-c Chapter 12: Sophisticated Topics text/20-ch12-chapter-12-sophisticated-topics.txt:1118(搜「Rosetta Stone」)
export + callconv(.C) Chapter 12: Sophisticated Topics text/20-ch12-chapter-12-sophisticated-topics.txt:1161(搜「count_words」) · text/20-ch12-chapter-12-sophisticated-topics.txt:1189(搜「magic incantation」) · text/20-ch12-chapter-12-sophisticated-topics.txt:1227(搜「fireworks」)
extern struct / 对齐 / packed Chapter 12: Sophisticated Topics text/20-ch12-chapter-12-sophisticated-topics.txt:1237(搜「diplomatic passport」) · text/20-ch12-chapter-12-sophisticated-topics.txt:1248(搜「picky eater」) · text/20-ch12-chapter-12-sophisticated-topics.txt:1264(搜「invisible padding」) · text/20-ch12-chapter-12-sophisticated-topics.txt:1284(搜「lockpicks」)
[*c]T 的警示 Chapter 12: Sophisticated Topics text/20-ch12-chapter-12-sophisticated-topics.txt:1312(搜「wild west」) · text/20-ch12-chapter-12-sophisticated-topics.txt:1336(搜「almost never」)
zig cc 荣誉提名 Chapter 12: Sophisticated Topics text/20-ch12-chapter-12-sophisticated-topics.txt:1348(搜「zig cc and zig c++ commands」)
本章概览定位 Chapter 12: Sophisticated Topics text/20-ch12-chapter-12-sophisticated-topics.txt:7(搜「introductory overview」)

  1. 出处:「Chapter 12: Sophisticated Topics」第 723–753 段(text/20-ch12-chapter-12-sophisticated-topics.txt:725,搜「generatePrimes」;text/20-ch12-chapter-12-sophisticated-topics.txt:747,搜「@setEvalBranchQuota(50000)」)。 ↩↩

  2. 出处:同章第 86–153 段(text/20-ch12-chapter-12-sophisticated-topics.txt:92,搜「crunch the numbers」;text/20-ch12-chapter-12-sophisticated-topics.txt:119,搜「parachute」;text/20-ch12-chapter-12-sophisticated-topics.txt:125,搜「@compileError」)。 ↩

  3. 出处:同章第 65–84 段(text/20-ch12-chapter-12-sophisticated-topics.txt:72,搜「chameleon」)。 ↩

  4. 出处:同章第 162–201 段(text/20-ch12-chapter-12-sophisticated-topics.txt:169,搜「tree-walking」;text/20-ch12-chapter-12-sophisticated-topics.txt:182,搜「speed demon」)。 ↩

  5. 出处:同章第 203–225 段(text/20-ch12-chapter-12-sophisticated-topics.txt:204,搜「custom-made suit」;text/20-ch12-chapter-12-sophisticated-topics.txt:222,搜「Invalid call」)。 ↩

  6. 出处:同章第 333–338 段(text/20-ch12-chapter-12-sophisticated-topics.txt:336,搜「ArrayList type is a type function」)。 ↩

  7. 出处:同章第 263–331 段(text/20-ch12-chapter-12-sophisticated-topics.txt:271,搜「FixedArray」;text/20-ch12-chapter-12-sophisticated-topics.txt:295,搜「fn Pair」)。 ↩

  8. 出处:同章第 343–412 段(text/20-ch12-chapter-12-sophisticated-topics.txt:351,搜「@typeOf: The detective」;text/20-ch12-chapter-12-sophisticated-topics.txt:377,搜「@typeInfo(i32)」;text/20-ch12-chapter-12-sophisticated-topics.txt:410,搜「i40」)。 ↩

  9. 出处:同章第 423–475 段(text/20-ch12-chapter-12-sophisticated-topics.txt:426,搜「generateStruct」;text/20-ch12-chapter-12-sophisticated-topics.txt:451,搜「MyStruct = generateStruct」)。 ↩

  10. 出处:同章第 481–514 段(text/20-ch12-chapter-12-sophisticated-topics.txt:481,搜「Swiss Army knife」;text/20-ch12-chapter-12-sophisticated-topics.txt:496,搜「Duck typing」)。 ↩

  11. 出处:同章第 504–511 段(text/20-ch12-chapter-12-sophisticated-topics.txt:504,搜「only allowed in function parameters」)。 ↩

  12. 出处:同章第 516–692 段(text/20-ch12-chapter-12-sophisticated-topics.txt:521,搜「Mistake 1」;text/20-ch12-chapter-12-sophisticated-topics.txt:574,搜「processValueBetter」;text/20-ch12-chapter-12-sophisticated-topics.txt:584,搜「everything should be anytype」)。 ↩

  13. 出处:同章第 700–710 段(text/20-ch12-chapter-12-sophisticated-topics.txt:706,搜「circuit breaker」)。 ↩

  14. 出处:同章第 711–756 段(text/20-ch12-chapter-12-sophisticated-topics.txt:720,搜「almost never use this function」)。 ↩↩

  15. 出处:同章第 775–803 段(text/20-ch12-chapter-12-sophisticated-topics.txt:792,搜「std.Thread.spawn」;text/20-ch12-chapter-12-sophisticated-topics.txt:801,搜「might exit before」)。 ↩

  16. 出处:同章第 809–866 段(text/20-ch12-chapter-12-sophisticated-topics.txt:825,搜「bouncer of your nightclub」;text/20-ch12-chapter-12-sophisticated-topics.txt:833,搜「Unlock even if you panic」)。 ↩

  17. 出处:同章第 867–908 段(text/20-ch12-chapter-12-sophisticated-topics.txt:882,搜「fetchAdd」;text/20-ch12-chapter-12-sophisticated-topics.txt:905,搜「seq_cst」)。 ↩

  18. 出处:同章第 917–943 段(text/20-ch12-chapter-12-sophisticated-topics.txt:920,搜「Data race」;text/20-ch12-chapter-12-sophisticated-topics.txt:926,搜「Deadlock」;text/20-ch12-chapter-12-sophisticated-topics.txt:930,搜「global locking order」;text/20-ch12-chapter-12-sophisticated-topics.txt:938,搜「funeral」)。 ↩

  19. 出处:同章第 944–1010 段(text/20-ch12-chapter-12-sophisticated-topics.txt:960,搜「num_workers = 5」;text/20-ch12-chapter-12-sophisticated-topics.txt:993,搜「You should see a result」)。 ↩↩

  20. 出处:同章第 1049–1060 段(text/20-ch12-chapter-12-sophisticated-topics.txt:1050,搜「rulebook」;text/20-ch12-chapter-12-sophisticated-topics.txt:1056,搜「extern declarations」)。 ↩

  21. 出处:同章第 1062–1094 段(text/20-ch12-chapter-12-sophisticated-topics.txt:1067,搜「cImport」;text/20-ch12-chapter-12-sophisticated-topics.txt:1075,搜「c.printf」)。 ↩

  22. 出处:同章第 1096–1110 段(text/20-ch12-chapter-12-sophisticated-topics.txt:1099,搜「-lc」;text/20-ch12-chapter-12-sophisticated-topics.txt:1108,搜「linkLibC」)。 ↩

  23. 出处:同章第 1112–1127 段(text/20-ch12-chapter-12-sophisticated-topics.txt:1118,搜「Rosetta Stone」)。 ↩

  24. 出处:同章第 1145–1228 段(text/20-ch12-chapter-12-sophisticated-topics.txt:1161,搜「count_words」;text/20-ch12-chapter-12-sophisticated-topics.txt:1189,搜「magic incantation」;text/20-ch12-chapter-12-sophisticated-topics.txt:1227,搜「fireworks」)。 ↩

  25. 出处:同章第 1185–1188 段(text/20-ch12-chapter-12-sophisticated-topics.txt:1185,搜「sentinel-terminated pointer」)。 ↩

  26. 出处:同章第 1197–1221 段(text/20-ch12-chapter-12-sophisticated-topics.txt:1202,搜「extern uint32_t」;text/20-ch12-chapter-12-sophisticated-topics.txt:1207,搜「Word count: 3」)。 ↩

  27. 出处:同章第 1237–1245 段(text/20-ch12-chapter-12-sophisticated-topics.txt:1237,搜「diplomatic passport」)。 ↩

  28. 出处:同章第 1247–1254 段(text/20-ch12-chapter-12-sophisticated-topics.txt:1248,搜「picky eater」)。 ↩

  29. 出处:同章第 1256–1304 段(text/20-ch12-chapter-12-sophisticated-topics.txt:1264,搜「invisible padding」;text/20-ch12-chapter-12-sophisticated-topics.txt:1276,搜「Packed structs eliminate padding」)。 ↩

  30. 出处:同章第 1306–1343 段(text/20-ch12-chapter-12-sophisticated-topics.txt:1312,搜「wild west」;text/20-ch12-chapter-12-sophisticated-topics.txt:1336,搜「almost never」)。 ↩↩

  31. 出处:同章第 1345–1355 段(text/20-ch12-chapter-12-sophisticated-topics.txt:1348,搜「zig c++ commands」)。 ↩

  32. 出处:同章第 762–766 段(text/20-ch12-chapter-12-sophisticated-topics.txt:764,搜「ch13 folder」)。 ↩

  33. 出处:同章第 249–257 段(text/20-ch12-chapter-12-sophisticated-topics.txt:251,搜「Guarantees type safety」;text/20-ch12-chapter-12-sophisticated-topics.txt:253,搜「Maximizes performance」;text/20-ch12-chapter-12-sophisticated-topics.txt:254,搜「Maintains clarity」)。 ↩

  34. 出处:同章第 1282–1301 段(text/20-ch12-chapter-12-sophisticated-topics.txt:1284,搜「lockpicks」;text/20-ch12-chapter-12-sophisticated-topics.txt:1300,搜「Master bit-aligned pointers」)。 ↩