1

我有一个 Zig 字节切片,即[]u8,并且 C 依赖项需要 avoid**作为参数。我如何将前者转换为后者?

4

2 回答 2

0

用指针 extern 你的函数参数

抄送

void gg(void **a) {
    printf("%s\n", a);
}

主要的.zig

extern fn gg(a: [*:0]const u8) void;

pub fn main() void {
    gg("hello");
}
$ zig run c.c main.zig -lc
hello
于 2021-11-21T18:10:05.640 回答
0

void**是一个指向任意透明的指针,相当于[*][*]anyopaquein zig。在 c 中,这可能指的是任意指针数组?或者只是一个奇怪的类型字节数组。

// assuming it just wants a pointer to a byte array
const slice: []const u8 = "123456";
c_function(@ptrCast(**anyopaque, slice.ptr));
// an array of anyopaque pointers
const slice = "123456";
const items: [*]*anyopaque = &[_]*anyopaque{@ptrCast(*anyopaque, slice.ptr)};
// *anyopaque to []u8
@ptrCast([*]u8, @alignCast(@alignOf(u8), c_pointer))[0..c_length]
于 2022-02-14T20:17:21.640 回答