2015-07-08 11 views
14

Ich habe eine Funktion, den Prototyp wie untenRost FFI. Casting void Zeiger

//opaque struct 
struct mosquitto; 

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

In meinem C-Code hat, ich bin es, wie unten anrufen.

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

Jetzt möchte ich die oben genannte API in meinem Rost Code aufrufen. Rost-bindgen erzeugt die folgenden Bindungen

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

Wenn ich versuche, die oben API aufrufen, ich bin eine Diskrepanz bei der 3. Argument bekommen.

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

Wie übergebe ich NULL an * mut c_void?

BONUS FRAGE: Wie eine Rost-Struktur zu * mut c_void übergeben?

Antwort

14

Die ptr::null() Funktion gibt ein *const T, was Sie wollen, ist die ptr::null_mut() Funktion, da das Argument an die Funktion vom Typ *mut ::libc::c_void.

Für einen tatsächlichen Wert vorbei, haben einen Blick auf die Antwort auf Working with c_void in an FFI

+0

Dank. Das hat funktioniert. Gibt es eine Möglichkeit, die Struktur, die von 'mqtt' gezeigt wird, zu drucken? Ich bekomme Panik, wenn ich das versuche -> println! ("Mqtt = {:?}", * Mqtt); – tez

+0

vielleicht gibt Ihre Funktion 'mosquitto_new' einen NULL zurück, oder Sie verwenden eine leere enum als Repräsentation. Ein leeres Enum kann nicht konstruiert werden, daher fügt Rust 'unreachable!()' Aufrufe vor jedem Code ein, der mit leeren Enums interagiert. Hier ist ein minimales Beispiel: http://is.gd/BOEDgb –