gpt4 book ai didi

casting - 为什么从对 c_void 指针的引用进行强制转换需要双重强制转换?

转载 作者:行者123 更新时间:2023-11-29 08:00:19 28 4
gpt4 key购买 nike

<分区>

在使用外部函数接口(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 的事情。

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