如何创建Rust回调函数以传递给FFI函数?

tez*_*tez 8 ffi rust

这就是C API的外观

void mosquitto_connect_callback_set(struct mosquitto *mosq, void (*on_connect)(struct mosquitto *, void *, int));
Run Code Online (Sandbox Code Playgroud)

rust-bindgen 为我生成了这个

pub fn mosquitto_connect_callback_set(
    mosq: *mut Struct_mosquitto,
    on_connect: ::std::option::Option<
        extern "C" fn(
            arg1: *mut Struct_mosquitto,
            arg2: *mut ::libc::c_void,
            arg3: ::libc::c_int,
        ) -> (),
    >,
)
Run Code Online (Sandbox Code Playgroud)

如何创建一个生锈回调函数以传递给on_connect上面的防锈绑定中的参数?

She*_*ter 8

如何创建生锈回调函数?

您是否阅读过Rust编程语言,特别是关于FFI标题为从C代码到Rust函数的回调的部分?

那里的例子是

extern "C" fn callback(a: i32) {
    println!("I'm called from C with value {0}", a);
}

#[link(name = "extlib")]
extern "C" {
    fn register_callback(cb: extern "C" fn(i32)) -> i32;
    fn trigger_callback();
}

fn main() {
    unsafe {
        register_callback(callback);
        trigger_callback(); // Triggers the callback
    }
}
Run Code Online (Sandbox Code Playgroud)

对于您的具体情况,您已经知道所需的特定功能类型:

extern "C" fn mycallback(
    arg1: *mut Struct_mosquitto,
    arg2: *mut ::libc::c_void,
    arg3: ::libc::c_int,
) -> () {
    println!("I'm in Rust!");
}
Run Code Online (Sandbox Code Playgroud)

然后像使用它一样

mosquitto_connect_callback_set(mosq, Some(mycallback));
Run Code Online (Sandbox Code Playgroud)