【发布时间】:2019-08-14 16:23:09
【问题描述】:
我有一个Option<&T>,我想要一个原始的*const T,如果选项是None,它是空的。我想包装一个 FFI 调用,它接受一个指向 Rust 分配对象的指针。
另外,我使用的 FFI 接口具有借用语义(我分配一些东西并传入一个指向它的指针),而不是所有权语义
extern "C" {
// Parameter may be null
fn ffi_call(*const T);
}
fn safe_wrapper(opt: Option<&T>) {
let ptr: *const T = ???;
unsafe { ffi_call(ptr) }
}
我可以使用match 语句来执行此操作,但该方法感觉非常冗长。
let ptr = match opt {
Some(inner) => inner as *const T,
None => null(),
};
我还可以将引用映射到指针,然后使用unwrap_or。
let ptr = opt.map(|inner| inner as *const T).unwrap_or(null());
但是,我担心指针在通过闭包时可能会失效。 Rust 是否保证最终指针将指向与原始引用相同的东西?如果T 是Copy,这是否会以有意义的方式改变语义?有没有更好的方法让我忽略?
【问题讨论】:
-
@Stargateur 我将最终使用
unsafe通过指针操作T。此外,我使用的 FFI 接口具有借用语义(我分配了一些东西并传递了一个指向它的指针),而不是所有权语义,所以&似乎比Box更好。这个问题是关于构造指针的,这是一个安全的操作。我的主要问题是:如何确保生成的指针实际上指向与引用相同的东西?
标签: rust