当我使用函数指针时,我发现 Zig 的一个有点奇怪的特性。
这是函数指针类型的一个简单示例:
const std = @import("std");
const print = std.debug.print;
const aFunc = fn (x: i32) void;
fn theFunc(x: i32) void {
print("have {}\n", .{x});
}
pub fn main() void {
const f: aFunc = theFunc;
f(3);
}
Run Code Online (Sandbox Code Playgroud)
这段代码编译并运行正常。
现在像这样更改它,向aFunc类型定义添加一个名称:
const std = @import("std");
const print = std.debug.print;
const aFunc = fn someFunc (x: i32) void;
fn theFunc(x: i32) void {
print("have {}\n", .{x});
}
pub fn main() void {
const f: aFunc = theFunc;
f(3);
}
Run Code Online (Sandbox Code Playgroud)
这段代码也可以,但是编译器不应该发出有关someFunc 的错误或警告吗?这个名字没用——当我尝试使用它而不是aFunc时,出现了编译错误。
编译器版本:
$ /opt/zig/zig version
0.10.0-dev.3431+4a4f3c50c
Run Code Online (Sandbox Code Playgroud)
它看起来像 Zig 源解析器处理的
const aFunc = fn someFunc (x: i32) void;
Run Code Online (Sandbox Code Playgroud)
就好像它是函数定义,但默默地删除了someFunc。
这是 Zig 编译器中的一个错误。它已在https://github.com/ziglang/zig/commit/fc213e2d61c9ae6e643ddebf502c699abe4055e8中修复,并在 v0.11.0 中发布。