我现在正在学习zig语言。我见过const类似关键字的结构体的定义
const X = struct {
n: i32,
};
Run Code Online (Sandbox Code Playgroud)
我的理解是,const是一种互补var,后者允许变化,前者不允许。但是用 定义 struct 意味着什么var?
var Y = struct {
n: i32,
};
Run Code Online (Sandbox Code Playgroud)
这是合法的吗?我编译,所以是的。但这有什么意义和用途呢?
Cri*_*ino 10
编译是因为 zig 是惰性计算的。因为Y未使用,编译器不检查它。
当你引用它时,编译器会抛出一个错误:
var Y = struct {
n: i32,
};
comptime {
@compileLog(Y);
}
Run Code Online (Sandbox Code Playgroud)
error: variable of type 'type' must be constant
var Y = struct {
^
Run Code Online (Sandbox Code Playgroud)
var是声明变量。当您var在全局范围内使用时,会创建一个全局变量。
在你的情况下,
error: variable of type 'type' must be constant
var Y = struct {
^
Run Code Online (Sandbox Code Playgroud)
声明Y为推断类型的变量。在这种情况下,Y是一个类型的变量type。
在 zig 中,只有 comptime 类型,即type. 类型为仅 comptime 类型的值只能存在于编译器中,您不能在运行时1 中创建该值。因此,编译器需要始终计算时间已知的值。
所以,因为Y是一个全局变量。您可以在运行时修改它。这就是错误的原因。的值Y不能由二进制生成/存储。
如果只存在于编译器中,则有效
var Y = struct {
n: i32,
};
Run Code Online (Sandbox Code Playgroud)
| 10
Run Code Online (Sandbox Code Playgroud)
1例如,考虑
comptime {
var Y = struct {
n: i32,
};
Y = struct {
count: u32,
};
const concrete = Y { .count = 10 };
@compileLog(concrete.count);
}
Run Code Online (Sandbox Code Playgroud)
error: unable to evaluate constant expression
std.debug.print("{}\n", .{ compilerKnown(runtimeValue) });
^
Run Code Online (Sandbox Code Playgroud)
这是一个错误,因为 zig 尝试将函数编译compilerKnown为二进制文件,但类型type是仅 comptime 的,因此无法生成二进制文件。特别是,不能生成机器码return u64。