gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:28:22 29 4
gpt4 key购买 nike

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

extern "C" {
pub fn get_some_data() -> *const SomeStruct;
}

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

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

再借

let data_ptr = get_some_data();
let data = if data_ptr.is_null() { None } else { unsafe { &*data_ptr } };

可以使用。 docs对于 mem::transmute声明

transmute is incredibly unsafe. There are a vast number of ways to cause undefined behavior with this function. transmute should be the absolute last resort.

并建议重新借用

Turning a *mut T into an &mut T

但是,对于可空指针,如第二个示例所示,这非常笨拙。

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

extern "C" {
pub fn get_some_data() -> Option<&SomeStruct>;
}

直接?

最佳答案

使用 <*const T>::as_ref ¹:

let data = unsafe { get_some_data().as_ref() };

因为原始指针可能不会指向任何 'a 的足够生命周期的有效对象, as_refunsafe打电话。

有对应的 as_mut 对于 *mut TOption<&mut T> .


¹ 这是一个不同的 as_ref来自,例如, AsRef::as_ref Option::as_ref ,这两者在安全代码中都很常见。

关于rust - FFI:将可空指针转换为选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66496133/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com