2015-07-08 19 views
14

Tôi đã một chức năng trong đó có nguyên mẫu như sauRust FFI. Đúc để làm mất hiệu lực con trỏ

//opaque struct 
struct mosquitto; 

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

Trong mã c của tôi, tôi gọi đó là như dưới đây.

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

Bây giờ tôi muốn gọi API ở trên trong mã gỉ của tôi. rust-bindgen tạo ra các ràng buộc sau đây

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

Khi tôi đang cố gắng gọi API ở trên, tôi nhận được sự không phù hợp ở đối số thứ 3.

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

Làm cách nào để chuyển NULL tới * mut c_void?

THƯỞNG THỬ NGHIỆM: Làm thế nào để chuyển cấu trúc gỉ tới * mut c_void?

Trả lời

14

Hàm ptr::null() trả về một *const T, những gì bạn muốn là hàm ptr::null_mut(), vì đối số cho hàm của bạn là loại *mut ::libc::c_void.

Để chuyển giá trị thực, hãy xem câu trả lời cho Working with c_void in an FFI

+0

Cảm ơn. Điều đó hiệu quả. Có cách nào mà tôi có thể in cấu trúc chỉ bởi 'mqtt'? Tôi nhận được một hoảng sợ khi tôi cố gắng này -> println! ("Mqtt = {:?}", * Mqtt); – tez

+0

có thể hàm 'mosquitto_new' của bạn trả về một NULL, hoặc là vì bạn đang sử dụng một enum rỗng làm đại diện. Một enum rỗng không thể được xây dựng, cho phép Rust chèn 'unreachable!()' Trước khi bất kỳ mã nào tương tác với các enum rỗng. Dưới đây là một ví dụ tối thiểu: http://is.gd/BOEDgb –

Các vấn đề liên quan