这就是C API的外观

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参数?

推荐答案

The Rust Programming Languagefirst edition有一个关于 foreign 金融机构的章节,标题是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
    }
}

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

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相关问答推荐

在Rust中,有没有一种方法让我定义两个 struct ,其中两个都遵循标准 struct ?

Arrow RecordBatch as Polars DataFrame

如何使用 list 在Rust for Windows中编译?

当一个箱子有自己的依赖关系时,两个人如何克服S每箱1库+n箱的限制?

支持TLS的模拟HTTP服务器

是否可以使用Rust宏来构建元组的项?

有没有一种惯用的方法来判断VEC中是否存在变体?

在IntoIter上调用.by_ref().Take().rev()时会发生什么情况

解析程序无法在Cargo 发布中 Select 依赖版本

为什么rustc会自动降级其版本?

由于生存期原因,返回引用的闭包未编译

为什么这个闭包没有实现Fn?

如何在Rust中使用Serde创建一个自定义的反序列化器来处理带有内部标记的枚举

在1.5n次比较中找到整数向量中的最大和次大整数

使用自定义 struct 收集 Vec

如何获得对数组子集的工作可变引用?

如何在 Rust 中创建最后一个元素是可变长度数组的 struct ?

如何创建动态创建值并向它们返回borrow 的工厂?

如何将 while 循环内的用户输入添加到 Rust 中的向量?

有没有比多个 push_str() 调用更好的方法将字符串链接在一起?