【发布时间】: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 库,传入指针的底层存储可以来自任何地方:静态全局变量、线程本地存储、堆、堆栈。唯一不能真正做到的是只读的。所以我的想法是我必须选择最大可能的生命周期(静态)。还是选择尽可能小的生命周期更正确:确保函数返回时指针不会被丢弃?
-
是的。引用的生命周期是一个下限,即它必须小于被引用数据的生命周期,所以
&'static只有在底层数据是'static本身的情况下才能存在,即在程序中从不丢弃或移动. -
知道了。所以我只想指定一个“比我的函数长”的生命周期——这是真正的隐式 API 要求。关闭以再次阅读该终身文档..:(