【问题标题】:Rust FFI. Casting to void pointer生锈 FFI。转换为 void 指针
【发布时间】:2015-09-26 22:12:31
【问题描述】:

我有一个原型如下的函数

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

【问题讨论】:

    标签: rust ffi


    【解决方案1】:

    ptr::null() 函数返回一个*const T,你想要的是ptr::null_mut() 函数,因为你的函数的参数类型是*mut ::libc::c_void

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

    【讨论】:

    • 谢谢。那行得通。有没有办法可以打印 mqtt 指向的结构?当我尝试这个时我感到恐慌 --> println!("mqtt = {:?}", *mqtt);
    • 也许你的mosquitto_new 函数返回一个NULL,或者是因为你使用一个空的枚举作为表示。无法构造空枚举,因此 Rust 在与空枚举交互的任何代码之前插入 unreachable!() 调用。这是一个最小的例子:is.gd/BOEDgb
    猜你喜欢
    • 2016-01-12
    • 2021-07-22
    • 2011-07-31
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    相关资源
    最近更新 更多