Skip to content
zig 版本:0.15.1

opaque

opaque 类型用于声明一个大小和对齐方式未知(但非零)的新类型。其内部可以像结构体、联合或枚举一样包含声明。

这通常用于与 C 代码交互时,确保类型安全,尤其是在 C 代码没有公开结构体细节的情况下。

zig
const Derp = opaque {};
const Wat = opaque {};

extern fn bar(d: *Derp) void;
fn foo(w: *Wat) callconv(.C) void {
    bar(w);
}

anyopaque

anyopaque 是一个特殊的类型,它可以代表任意一种 opaque 类型(因为每个 opaque 类型根据其内部声明的不同而被视为不同类型)。它常用于与 C 交互的函数中,类似于 C 的 void*,通常用于类型擦除的指针。

🅿️ 提示

需要注意的是,void 的大小为 0 字节,而 anyopaque 的大小未知但非零。

常见使用场景

与 C 语言互操作

opaque 类型最常见的用途是在与 C 代码交互时处理 不透明指针(opaque pointer)。当 C 库不公开结构体的内部细节时,Zig 可以使用 opaque 类型来安全地表示这些类型:

zig
// 对应 C 中的 typedef struct FILE FILE;
const FILE = opaque {};
const c = @cImport(@cInclude("stdio.h"));

// 使用不透明指针
fn readFile(file: *FILE) void {
    // file 指向一个大小未知的结构体
    // 只能通过 C 函数来操作它
    _ = file;
}

类型擦除

使用 *anyopaque 可以实现类似 C 语言 void* 的类型擦除功能。这在需要存储任意类型指针的场景中很有用:

zig
const Context = struct {
    data: *anyopaque,  // 可以指向任意类型
    callback: *const fn (*anyopaque) void,
};

🅿️ 提示

使用 anyopaque 时需要格外小心类型安全。在可能的情况下,优先考虑使用泛型或联合类型来保持类型信息。