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