如何在Zig中初始化可变函数参数?



在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"});
}

最新更新