【发布时间】:2021-04-24 16:40:20
【问题描述】:
我可以通过 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 };
这会导致编译器错误:“无法从外部静态读取”。这样做的正确方法是什么(如果有的话)?
【问题讨论】:
-
正确的方法是使用
unsafe -
您仍然可以通过一些 getter/setter 围绕该变量提供一些安全接口。在那个界面中它是不安全的,就像
add的例子一样。