web-dev-qa-db-ja.com

RustFFI。voidポインタへのキャスト

以下のような試作品を持った関数があります

//opaque struct
struct mosquitto;

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

私のcコードでは、以下のように呼んでいます。

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

ここで、上記のAPIをRustコードで呼び出します。Rust-bindgenは次のバインディングを生成しました

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

上記のAPIを呼び出そうとすると、3番目の引数で不一致が発生します。

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

NULLを* mut c_voidに渡すにはどうすればよいですか?

ボーナス質問: Rust構造体を* mut c_voidに渡す方法は?

16
tez

ptr::null()関数は*const Tを返します。関数の引数は*mut ::libc::c_void型であるため、必要なのは ptr::null_mut() 関数です。

実際の値を渡すには、 FFIでのc_voidの操作 の答えを見てください。

18
oli_obk