在没有不安全的情况下使用 Rust 中的 C 变量

Use C variable from Rust without unsafe

我可以通过 FFI 将 C 函数暴露给 Rust 代码,如下所示:

use std::os::raw::c_int;

mod c {
    #[link(name="...")]
    extern "C" {
        pub fn add(a: c_int, b: c_int) -> c_int;
    }
}

pub fn add(a: c_int, b: c_int) -> c_int {
    unsafe {
        c::add(a, b)
    }
}

现在我可以从 Rust 调用 add,而不必将其包装在另一个 unsafe 块中。但是如果我想对一个变量做同样的事情呢?即:

use std::os::raw::c_int;

mod c {
    #[link(name="...")]
    extern "C" {
        pub static VAR: c_int;
    }
}

pub static VAR: c_int = unsafe { c::VAR };

这会导致编译器错误:“无法从外部静态读取”。执行此操作的正确方法是什么(如果有的话)?

确实不安全就应该是不安全的,虽然你可以静态借用导入的全局变量。

static VAR: &i32 = unsafe { &c::VAR };