我有一个函数,其原型如下

//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 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?

BONUS QUESTION:如何将 rust struct 传递给*mut c_void?

推荐答案

ptr::null()函数返回*const T,您需要的是ptr::null_mut()函数,因为函数的参数类型是*mut ::libc::c_void.

要传递实际值,请查看Working with c_void in an FFI的答案

Rust相关问答推荐

包含嵌套 struct 的CSV

为什么幻影数据不能自动推断?

如何访问Rust存储值的内存地址

什么是Rust惯用的方式来使特征向量具有单个向量项的别名?

S在Cargo.toml中添加工作空间开发依赖关系的正确方法是什么?

无符号整数的Rust带符号差

为什么RefCell没有与常规引用相同的作用域?

期望一个具有固定大小 x 元素的数组,找到一个具有 y 元素的数组

Rust wasm 中的 Closure::new 和 Closure::wrap 有什么区别

将 &str 或 String 保存在变量中

需要一个有序向量来进行 struct 初始化

Rust 文件未编译到 dll 中

在描述棋盘时如何最好地使用特征与枚举

中文优化标题:跳出特定循环并返回一个值

Rust 打包在 .deb 中

从 Rust 中的 if/else 中的引用创建 MappedRwLockWriteGuard

仅当函数写为闭包时才会出现生命周期错误

产生拥有值的迭代器的 Rust 可变borrow 在循环中失败

If let expression within .iter().any

在特征中返回一个 Self 类型的值