如何创建 Rust 回调函数以传递给 FFI 函数? [英] How do I create a Rust callback function to pass to a FFI function?
本文介绍了如何创建 Rust 回调函数以传递给 FFI 函数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
这是 C API 的样子
This is how the C API looks
void mosquitto_connect_callback_set(struct mosquitto *mosq, void (*on_connect)(struct mosquitto *, void *, int));
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,
) -> (),
>,
)
如何创建一个 Rust 回调函数来传递给上述 Rust 绑定中的 on_connect
参数?
How do I create a Rust callback function to pass to the on_connect
parameter in the above Rust binding?
推荐答案
Rust 编程语言,第一版,有一个关于 FFI 的部分,标题为 从 C 代码到 Rust 函数的回调.
The Rust Programming Language, first edition, has a section about FFI titled Callbacks from C code to Rust functions.
那里的例子是
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
}
}
对于您的具体情况,您已经知道您需要的具体功能类型:
For your specific case, you already know the specific type of function you need:
extern "C" fn mycallback(
arg1: *mut Struct_mosquitto,
arg2: *mut ::libc::c_void,
arg3: ::libc::c_int,
) -> () {
println!("I'm in Rust!");
}
然后像这样使用
mosquitto_connect_callback_set(mosq, Some(mycallback));
这篇关于如何创建 Rust 回调函数以传递给 FFI 函数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文