小编Wis*_*ind的帖子

FFI:将可空指针转换为选项

我正在使用 rust-bindgen 从 Rust 访问 C 库。某些函数返回指向结构的可空指针,bindgen 表示为

extern "C" {
    pub fn get_some_data() -> *const SomeStruct;
}
Run Code Online (Sandbox Code Playgroud)

现在,对于更高级别的包装器,我想将其转换为Option<&'a SomeStruct>具有适当生命周期的。由于可空指针优化,这实际上与 表示相同*const SomeStruct。但是,我找不到任何简洁的语法可以在两者之间进行转换。转变

let data: Option<&'a SomeStruct> = unsafe { mem::transmute( get_some_data() ) };
Run Code Online (Sandbox Code Playgroud)

和再借用

let data_ptr = get_some_data();
let data = if data_ptr.is_null() { None } else { unsafe { &*data_ptr } };
Run Code Online (Sandbox Code Playgroud)

可用于。文档说明mem::transmute

转变是非常不安全的。有很多方法会导致此函数出现未定义的行为。嬗变应该是绝对的最后手段。

并建议重新借款

将 *mut T 转换为 &mut T

然而,对于可为空指针来说,这非常笨拙,如第二个示例所示。

问:这个转换有更简洁的语法吗?或者,有没有办法告诉bindgen生成

extern "C" {
    pub fn get_some_data() -> …
Run Code Online (Sandbox Code Playgroud)

casting ffi rust

3
推荐指数
1
解决办法
683
查看次数

标签 统计

casting ×1

ffi ×1

rust ×1