diff --git a/learn/.vitepress/sidebar.ts b/learn/.vitepress/sidebar.ts index 26a4ee57..ef464d1d 100644 --- a/learn/.vitepress/sidebar.ts +++ b/learn/.vitepress/sidebar.ts @@ -181,9 +181,6 @@ export default [ { text: "更多", items: [ - { - text: "什么是“命名空间”", - }, { text: "函数反射", }, diff --git a/learn/more/miscellaneous.md b/learn/more/miscellaneous.md index 78f8a0be..4b7aa7a6 100644 --- a/learn/more/miscellaneous.md +++ b/learn/more/miscellaneous.md @@ -5,3 +5,42 @@ outline: deep # 杂项 本部分是关于 zig 一些额外知识的补充,暂时还没有决定好分类到何处! + +## 容器 + +在 Zig 中,**容器** 是充当保存变量和函数声明的命名空间的任何语法结构。容器也是可以实例化的类型定义。结构体、枚举、联合、不透明,甚至 Zig 源文件本身都是容器,但容器并不能包含语句(语句是描述程序运行操作的一个单位)。 + +当然,你也可以这样理解,容器是一个只包含变量或常量定义以及函数定义的命名空间。 + +注意:容器和块(block)不同! + +## `usingnamespace` + +关键字 `usingnamespace` 可以将一个容器中的所有 `pub` 声明混入到当前的容器中。 + +例如,可以使用将 `usingnamespace` 将 std 标准库混入到 `main.zig` 这个容器中: + +```zig +const T = struct { + usingnamespace @import("std"); +}; +pub fn main() !void { + T.debug.print("Hello, World!\n", .{}); +} +``` + +注意:无法在结构体 `T` 内部直接使用混入的声明,需要使用 `T.debug` 这种方式才可以! + +`usingnamespace` 还可以使用 `pub` 关键字进行修饰,用于转发声明,这常用于组织 API 文件和 C import。 + +```zig +pub usingnamespace @cImport({ + @cInclude("epoxy/gl.h"); + @cInclude("GLFW/glfw3.h"); + @cDefine("STBI_ONLY_PNG", ""); + @cDefine("STBI_NO_STDIO", ""); + @cInclude("stb_image.h"); +}); +``` + +