- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
<分区>
在使用外部函数接口(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 的事情。
UnsafeCell documentation说 The UnsafeCell type is the only legal way to obtain aliasable data that is
这个问题在这里已经有了答案: Why would it be necessary to perform two casts to a mutable raw pointer in a row? (1
我正在为库编写绑定(bind),其中在Rust中有一个参数类型为void* aka *mut c_void的函数。我必须为此参数分配一个数组,如何在Rust中做到这一点? 我试过强制转换transmu
我需要在 Rust 线程之间共享从 C++ 创建的对象。我已经将它包装在一个 Mutex 结构中,所以现在在线程之间发送是安全的。但是编译器不会让我做什么。 error[E0277]: `*mut
我正在尝试调用 setsockopt但无法弄清楚 c_void 的转换。 IP_HDRINCL 不在 nix 或 socket 包中,所以我必须使用 libc。我以 How to set the so
我正在努力通过接受 void 的 FFI 传递结构并在另一端读回它。 有问题的库是 libtsm,一个终端状态机。它允许您提供输入,然后找出输入后终端将处于哪种状态。 它将其绘制函数声明为: pub
这个问题在这里已经有了答案: How can I call a raw address from Rust? (1 个回答) 关闭 3 年前。 互联网的 friend 们好, 我正在努力调用存储在
我有一个 C++ 数组形式的矩阵,想将其传递给用 Rust 编写的共享库函数。我有这样的东西 #![crate_type = "dylib"] extern crate libc; use libc:
我一直在尝试用 Rust 编写 Redis 模块。这是我第一次尝试使用 Rust FFI 和绑定(bind)。如何在不破坏 Redis 指针的情况下调用此方法并在 Rust 中得到一个数据值? ext
这是我使用 c2rust 生成的一些代码然后清理了一下: #![feature(libc)] extern crate libc; use libc::*; use std::mem::transmu
我是一名优秀的程序员,十分优秀!