使用函数名称声明指向函数类型的指针

dee*_*eed 6 zig

当我使用函数指针时,我发现 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。

P.T*_*.T. 2

这是 Zig 编译器中的一个错误。它已在https://github.com/ziglang/zig/commit/fc213e2d61c9ae6e643ddebf502c699abe4055e8中修复,并在 v0.11.0 中发布。