<分区>
在使用外部函数接口(interface) (FFI) 时,我经常看到从引用到指针到结构到指针到指针到 void 的双重转换。例如,给定一个类似 FFI 的函数:
unsafe fn ffi(param: *mut *mut c_void) {}
调用方式是:
struct foo;
let mut bar: *mut foo = ptr::null_mut();
unsafe { ffi(&mut bar as *mut *mut _ as *mut *mut c_void); }
删除中间转换会产生此错误:
error[E0606]: casting `&mut *mut foo` as `*mut *mut winapi::ctypes::c_void` is invalid
--> src\main.rs:36:18
|
36 | unsafe { ffi(&mut bar as *mut *mut c_void); }
|
我试图让编译器告诉我中间类型是什么,方法是将它强制为一个明显错误的类型:
let mut bar: *mut foo = ptr::null_mut();
let mut test: u8 = &mut bar as *mut *mut _;
导致此错误的原因:
error[E0308]: mismatched types
--> src\main.rs:36:24
|
36 | let mut test: u8 = &mut bar as *mut *mut _;
| ^^^^^^^^^^^^^^^^^^^^^^^ expected u8, found *-ptr
|
= note: expected type `u8`
found type `*mut *mut _`
但是 *-ptr
似乎不是我可以用来代替 _
的实际类型。为什么需要中间的as *mut *mut _
,推断的类型是什么?
我发现这个问题是相关的 ( Working with c_void in an FFI ) 但它实际上并没有解释任何关于双重 Actor 的事情。