来自静态和可变的 C 指针的 Rust 引用?

Rust reference from C pointer that is static and mutable?

我正在用 Rust 编写一个 C 接口库。我的 API 非常像 C:我得到“不透明”指针作为函数参数,我必须将其转换为指向我的库内部结构的指针。所以指针的生命周期比函数调用(静态)长,指针指向可变数据(库负责初始化和 getting/setting 这个数据)。可变性 + 静态数据是 API 的隐含部分,但在生锈中我遇到了麻烦(我认为只是语法)说明这一点。

代码如下所示:

struct Real_attr { ... }

pub extern "C" fn attr_init(attr: *mut attr_ptr) -> cty::c_int {
  let p : *mut Real_attr = attr.cast::<Real_attr>();
  let r : &mut Real_attr = p.as_ref::<'static'>().unwrap();
  ...
}

这给我一个错误:

42 |         p.as_ref::<'static>()
   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ types differ in mutability
   |
   = note: expected enum `Option<&'static mut Real_attr>`
              found enum `Option<&'static Real_attr>`

但我不明白如何“强制转换”或以其他方式指定该引用是可变的,在 static 后添加 mut 使我出现语法错误..

如果你想要一个可变引用,你正在寻找 as_mut

let r : &mut Real_attr = p.as_mut::<'static>().unwrap();