#全局 #变量 # #var #声明

global_var

声明全局变量的简单宏

1 个不稳定版本

0.1.0 2023年10月4日

#2371Rust 模式

MIT 许可证

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_varget_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,不同的线程可以访问全局变量。这是你的责任使用适当的锁机制。

无运行时依赖