在没有不安全的情况下使用 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 };
我可以通过 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 };