【发布时间】:2018-05-17 06:06:48
【问题描述】:
在使用外部函数接口 (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),但它实际上并没有解释关于双重演员的任何内容。
【问题讨论】:
-
哇,我都回答了,完全忘记了,很好。我确实像以前一样有这种模糊的感觉。
-
我很欣赏这两个答案:)