How do I create a Rust callback function to pass to a FFI function?

前端 未结 1 941
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-12-01 19:13

This is how the C API looks

void mosquitto_connect_callback_set(struct mosquitto *mosq, void (*on_connect)(struct mosqu         


        
相关标签:
1条回答
  • 2020-12-01 19:49

    The Rust Programming Language, first edition, has a section about FFI titled Callbacks from C code to Rust functions.

    The example from there is

    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!");
    }
    

    And then use it like

    mosquitto_connect_callback_set(mosq, Some(mycallback));
    
    0 讨论(0)
提交回复
热议问题