Rust - упаковка пользовательской безопасной функции в небезопасную функцию FFI для обратного вызова FFI - PullRequest
0 голосов
/ 17 апреля 2020

Я пытаюсь превратить небезопасную функцию 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);

Как я могу обернуть безопасную функцию в (возможно, анонимную) функцию внутри тела функции?

Могу ли я использовать Closures? Если да, то как?

1 Ответ

0 голосов
/ 18 апреля 2020

Вы можете обернуть небезопасный код в безопасную функцию. На самом деле есть раздел в книге о ржавчине , в котором рассказывается, как именно.

Ниже приведен пример, скопированный из книги, для краткости изложенный:

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 предоставит, как мне кажется, лучшую документацию в отрасли для ответов на подобные вопросы. Я не могу не подчеркнуть, что новички должны использовать его в полной мере; это редкий и невероятно полезный камень.

...