我正在使用 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() -> Option<&SomeStruct>;
}
Run Code Online (Sandbox Code Playgroud)
直接地?
使用<*const T>::as_ref\xc2\xb9:
let data = unsafe { get_some_data().as_ref() };\nRun Code Online (Sandbox Code Playgroud)\n由于原始指针可能不指向任何具有足够生命周期的有效对象\'a,as_ref因此unsafe要调用。
有一个对应as_mut的*mut T\xe2\x86\x92 Option<&mut T>。
\xc2\xb9 这与as_ref例如AsRef::as_ref和不同Option::as_ref,两者在安全代码中都很常见。