【问题标题】:Rust reference from C pointer that is static and mutable?来自静态和可变 C 指针的 Rust 引用?
【发布时间】:2021-08-19 06:29:06
【问题描述】:

我正在用 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>`

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

【问题讨论】:

  • “指针的生命周期比函数调用长(静态)”——一般来说,这是不正确的暗示。 'staticlifetime 是可以无限期持有的事物的生命周期,例如存储在线程本地存储中,直到线程死亡。所以,严格来说,你所做的事情是不健全的。
  • @Cerberus 所以这是一个 C 库,传入指针的底层存储可以来自任何地方:静态全局变量、线程本地存储、堆、堆栈。唯一不能真正做到的是只读的。所以我的想法是我必须选择最大可能的生命周期(静态)。还是选择尽可能小的生命周期更正确:确保函数返回时指针不会被丢弃?
  • 是的。引用的生命周期是一个下限,即它必须小于被引用数据的生命周期,所以&amp;'static只有在底层数据是'static本身的情况下才能存在,即在程序中从不丢弃或移动.
  • 知道了。所以我只想指定一个“比我的函数长”的生命周期——这是真正的隐式 API 要求。关闭以再次阅读该终身文档..:(

标签: rust lifetime


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-06
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    相关资源
    最近更新 更多