1 个不稳定版本
0.1.0 | 2023年10月4日 |
---|
#2371 在 Rust 模式
7KB
use global_var::*;
// type and initializer
new_global_var!(Vec<u32>, Vec::new());
fn main() {
foo();
foo();
bar();
bar();
}
fn foo() {
unsafe {
let v = get_mut_global_var();
v.push(3);
println!("{v:?}");
}
}
fn bar() {
unsafe {
let v = get_mut_global_var();
v.push(4);
println!("{v:?}");
}
}
// prints
// [3]
// [3, 3]
// [3, 3, 4]
// [3, 3, 4, 4]
use global_var::*;
// 2 different global variables
new_global_var!(GLOBAL_VAR1, FLAG1, init_global_var1, get_mut_global_var1, Vec<u32>, Vec::new());
new_global_var!(GLOBAL_VAR2, FLAG2, init_global_var2, get_mut_global_var2, Vec<u64>, Vec::new());
fn main() {
foo();
foo();
bar();
bar();
}
fn foo() {
unsafe {
let v = get_mut_global_var1();
v.push(3);
println!("{v:?}");
}
}
fn bar() {
unsafe {
let v = get_mut_global_var2();
v.push(4);
println!("{v:?}");
}
}
// prints
// [3]
// [3, 3]
// [4]
// [4, 4]
new_global_var!(HashMap<u32, u32>, HashMap::new())
创建了两个函数: init_global_var
和 get_mut_global_var
。第一个函数 init_global_var
初始化了 HashMap<u32, u32>
的全局版本。它可以多次安全初始化。第二个函数 get_mut_global_var
返回 &mut HashMap<_, _>
。如果尚未初始化,则调用 init_global_var
。
尽管这是一个声明全局变量的非常方便的方法。但有一个缺点:你只能调用这个宏一次。如果你多次调用它,将创建具有相同名称的全局变量,这将导致编译错误。为了使用多个全局变量,你应该使用这个宏的详细版本。它看起来像这样: new_global_var!(GLOBAL_VAR_NAME, IS_INIT, init_global_var, get_mut_global_var, HashMap<u32, u32>, HashMap::new())
。前两个标识符是全局变量的名称(以及初始化标志)。你不会再使用这些名称,所以你可以自由地命名它们。但请确保名称是唯一的。第三和第四个是你要使用的函数。
由于它是 static mut
,不同的线程可以访问全局变量。这是你的责任使用适当的锁机制。