微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决来自静态和可变的 C 指针的 Rust 引用?

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

代码如下:

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();

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。