是否可以声明两个相互依赖的静态可变变量



我试图声明两个静态可变变量,但我有一个错误:

static mut I: i64 = 5;
static mut J: i64 = I + 3;
fn main() {
unsafe {
println!("I: {}, J: {}", I, J);
}
}

错误:

error[E0133]: use of mutable static is unsafe and requires unsafe function or block
--> src/main.rs:2:21
|
2 | static mut J: i64 = I + 3;
|                     ^ use of mutable static
|
= note: mutable statics can be mutated by multiple threads: aliasing violations or data races will cause undefined behavior

这不可能吗?我还试图在声明上放置一个unsafe块,但它似乎是不正确的语法:

static mut I: i64 = 5;
unsafe {
static mut J: i64 = I + 3;
}

是的。

在您的情况下,只需删除mut,因为静态全局变量可以安全访问,因为它们不能更改,因此不会受到所有坏属性的影响,比如不同步访问。

static I: i64 = 5;
static J: i64 = I + 3;
fn main() {
println!("I: {}, J: {}", I, J);
}

如果您希望它们是可变的,您可以在访问不安全变量的地方使用unsafe(在本例中为I(。

static mut I: i64 = 5;
static mut J: i64 = unsafe { I } + 3;
fn main() {
unsafe {
println!("I: {}, J: {}", I, J);
}
}

最新更新