function - rust -将用户提供的安全功能包装到不安全的FFI功能中以进行FFI回调

标签 function rust closures ffi

我正在尝试将不安全的FFI函数包装到“更安全”的函数中。
目前,我的问题基本上是这样的:

fn do_ffi_safe(arg1: u16, callback: fn(result: u16) -> bool) {
    //I have to wrap callback into a unsafe extern "C" fn here to use as a callback

    do_ffi_unsafe(arg1: u16, Some(//And use the unsafe callback here));
}

unsafe extern "C" do_ffi_unsafe(arg1: u16, Option<unsafe extern "C" fn(result: u16) -> bool);

如何将安全函数包装到函数体内的(可能是匿名的)函数中?

我可以使用瓶盖吗?如果是,怎么办?

最佳答案

您可以将不安全的代码包装在安全的函数中。实际上,a section in the Rust book可以告诉您确切的操作方法。

以下是从书中复制的示例,为简洁起见进行了重述:

use std::slice;

fn split_at_mut(slice: &mut [i32], mid: usize) -> (&mut [i32], &mut [i32]) {
    let len = slice.len();
    let ptr = slice.as_mut_ptr();

    assert!(mid <= len);

    unsafe {
        (slice::from_raw_parts_mut(ptr, mid),
         slice::from_raw_parts_mut(ptr.offset(mid as isize), len - mid))
    }
}

为了将来引用,Rust团队提供了我认为是业内最好的文档,可以回答此类问题。我不能太过强调新来者应该最大程度地使用它。这是一种罕见且极为有用的 gem 。

关于function - rust -将用户提供的安全功能包装到不安全的FFI功能中以进行FFI回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61280518/

相关文章:

java - 从列表中的对象获取参数

python - secret 圣诞老人分院帽

javascript - 从另一个页面调用 javascript 函数

使用rust "error: moving out of immutable field"

rust - 是否记录了 Cargo 可以下载和捆绑同一个箱子的多个版本?

javascript - 循环闭合 - 我把它放在哪里?

python - 调用 if __name__ == '__main__' : in one module from a function in another module

c# - 无法将 nuget 包安装到 azure 函数中

rust - cargo 构建失败 : could not find macro `llvm_asm` in this scope

Javascript 闭包和事件