2015-07-08 1 views
14

Ho una funzione che ha il prototipo, come di seguitoRuggine FFI. Casting di annullare puntatore

//opaque struct 
struct mosquitto; 

struct mosquitto *mosquitto_new(const char *id, bool clean_session, void *obj); 

Nel mio codice C, sto chiamando come qui sotto.

struct mosquitto *m = mosquitto_new(buf, true, NULL); 

Ora voglio chiamare l'API di cui sopra nel mio codice ruggine. ruggine bindgen generato il seguente attacchi

pub enum Struct_mosquitto { } 
pub fn mosquitto_new(id: *const ::libc::c_char, clean_session: u8, obj: *mut ::libc::c_void) -> *mut Struct_mosquitto; 

Quando sto cercando di chiamare l'API di cui sopra, sto diventando una mancata corrispondenza al terzo argomento.

let s = CString::new("ravi").unwrap(); 
let mqtt = mosquitto::mosquitto_new(s.as_ptr(), 1, ptr::null()); 

Come passare NULL a * mut c_void?

DOMANDA BONUS: Come passare una struttura di ruggine a * mut c_void?

risposta

14

La funzione ptr::null() restituisce un *const T, ciò che si vuole è la funzione ptr::null_mut(), dal momento che l'argomento alla funzione è di tipo *mut ::libc::c_void.

Per il superamento di un valore effettivo, hanno uno sguardo alla risposta a Working with c_void in an FFI

+0

Grazie. Ha funzionato. C'è un modo per stampare la struct indicata da 'mqtt'? Mi viene il panico quando provo questo -> println! ("Mqtt = {:?}", * Mqtt); – tez

+0

forse la tua funzione 'mosquitto_new' restituisce un valore NULL, o perché stai usando un enum vuoto come rappresentazione. Un enum vuoto non può essere costruito, quindi Rust inserisce 'unreachable!()' Chiama prima di qualsiasi codice che interagisce con enumerazioni vuote. Ecco un esempio minimo: http://is.gd/BOEDgb –