在Zig函数中使用和初始化可变参数的正确方法是什么?
fn variadicFunc(val: u8, variadicArg: ...u8) {
for (variadicArg) |arg| {
// ... work on the arg
_ = arg;
}
}
回答我自己的问题,感谢来自Zig Discord的Aiz和Hanna:
用Zig编写variadicFunction最基本的方法是使用anytype
和匿名结构体:
fn variadicFunc(variadicArg: anytype) {
for (std.meta.fields(@TypeOf(items)) |field| {
const value = @field(items, field.name);
// work with the value
}
}
variadicFunc(.{"Hello", 12, .{ Hello } });
但是要小心。这将导致二进制文件膨胀。尽可能使用数组或切片。
对于anytype
和@call
都是可能的。
pub extern "c" fn printf(format: [*:0]const u8, ...) c_int;
const std = @import("std");
fn call_printf(fmt: [*:0]const u8, args: anytype) c_int {
return @call(.{}, std.c.printf, .{fmt} ++ args);
}
pub fn main() anyerror!void {
_ = call_printf("All your codebase are belong to %s.", .{"us"});
}