首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建一个Rust回调函数以传递给FFI函数?

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

Stack Overflow用户
提问于 2015-07-16 19:58:29
回答 1查看 5.9K关注 0票数 12

这就是C API的样子。

代码语言:javascript
复制
void mosquitto_connect_callback_set(struct mosquitto *mosq, void (*on_connect)(struct mosquitto *, void *, int));

rust-bindgen已经为我生成了这个

代码语言:javascript
复制
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参数?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-16 20:19:49

http://doc.rust-lang.org/stable/book/第一版,有一个关于FFI的章节,名为C代码对锈蚀函数的回调

下面的例子是

代码语言:javascript
复制
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
    }
}

对于您的具体情况,您已经知道了您需要的特定类型的函数:

代码语言:javascript
复制
extern "C" fn mycallback(
    arg1: *mut Struct_mosquitto,
    arg2: *mut ::libc::c_void,
    arg3: ::libc::c_int,
) -> () {
    println!("I'm in Rust!");
}

然后把它当作

代码语言:javascript
复制
mosquitto_connect_callback_set(mosq, Some(mycallback));
票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31463426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档