铁锈 FFI。转换为 void 指针
Rust FFI. Casting to void pointer
我有一个函数,其原型如下
//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);
现在我想在我的 rust 代码中调用上面的 API。 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 时,我发现第三个参数不匹配。
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?
ptr::null()
函数returns一个*const T
,你想要的是ptr::null_mut()
函数,因为你函数的参数是*mut ::libc::c_void
类型.
要传递实际值,请查看 Working with c_void in an FFI
的答案
我有一个函数,其原型如下
//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);
现在我想在我的 rust 代码中调用上面的 API。 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 时,我发现第三个参数不匹配。
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?
ptr::null()
函数returns一个*const T
,你想要的是ptr::null_mut()
函数,因为你函数的参数是*mut ::libc::c_void
类型.
要传递实际值,请查看 Working with c_void in an FFI
的答案