rust - 什么 transmute::<*mut c_void, Option()>> 是什么意思?
问题描述
这是我使用c2rust生成的一些代码,然后进行了一些清理:
#![feature(libc)]
extern crate libc;
use libc::*;
use std::mem::transmute;
extern "C" {
#[no_mangle]
fn read(__fd: c_int, __buf: *mut c_void, __nbytes: c_ulong) -> c_long;
#[no_mangle]
fn mmap(
__addr: *mut c_void,
__len: c_ulong,
__prot: c_int,
__flags: c_int,
__fd: c_int,
__offset: c_long,
) -> *mut c_void;
}
pub fn main() {
unsafe {
let buf: *mut c_void = mmap(
0 as *mut c_void,
256i32 as c_ulong,
0x1i32 | 0x2i32 | 0x4i32,
0x2i32 | 0x20i32,
-1i32,
0i32 as c_long,
);
read(0i32, buf, 256i32 as c_ulong);
transmute::<*mut c_void, Option<unsafe extern "C" fn() -> ()>>(buf).unwrap()();
}
}
虽然我理解它的作用,但我不确定如何解释最后一个表达式。是什么Option<unsafe extern "C" fn() -> ()>
意思?
解决方案
我们试图调用一个unsafe extern "C" fn() -> ()
,它基本上是一个没有参数也没有返回类型的函数。我的第一次尝试是只使用的文档as
中定义的关键字。transmute
我收到以下错误:
error[E0605]: non-primitive cast: `*mut libc::c_void` as `unsafe extern "C" fn()`
--> wx.rs:32:9
|
32 | (buf as unsafe extern "C" fn() -> ())();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: an `as` expression can only be used to convert between primitive types. Consider using the `From` trait
看起来该函数是非原始类型,这就是我需要transmute
. 我尝试了以下方法:
transmute::<
*mut c_void,
unsafe extern "C" fn() -> ()
>(buf)();
并且代码按预期编译并实际运行。
我仍然不明白为什么Option
c2rust 使用它,但是没有它,代码可以正常工作。似乎unsafe
也extern "C"
可以删除并且代码仍然有效,至少对我而言。
推荐阅读
- python - 如何在 Python 中使用正则表达式删除字符串列表中的重复行?
- r - R中具有回溯功能的梯度下降法
- javascript - 如果某些条件失败 - JavaScript Jasmine,有没有办法跳过套件中的所有测试?
- reactjs - 无法使用 MUI 主题中的调色板颜色
- python - 有没有办法以向量化的方式从 Numpy 的多元正态分布中批量采样?
- python - tensorflow 2.6.0 'keras.backend' 没有属性'random generator'
- php - Magento 不会在前端显示错误消息
- python - 如何使用条件函数更改多个列,其他列接收数字 0
- c - yacc 解析器在左递归后缀之前减少
- php - 注意:在第 145 行的 C:\wamp64\www\Project\FeePayment.php 中遇到了格式不正确的数值