這是我想在C代碼做什麼:如何在使用Rust FFI時初始化一個不透明的C結構?
#include <some_lib.h>
int main() {
some_lib_struct_t x;
some_lib_func(&x);
}
如何利用魯斯特庫的?下面是我到目前爲止有:
extern crate libc;
struct some_lib_struct_t;
#[link(name="some_lib")]
extern {
fn some_lib_func(x: *mut some_lib_struct_t);
}
fn main() {
let mut x: some_lib_struct_t;
unsafe {
some_lib_func(&mut x);
}
}
當編譯我(不那麼令人驚訝的)得到的錯誤:use of possibly uninitialized `x`
。
編輯
閱讀Shepmaster的回答後,我看了看在庫的頭越來越近。正如他們所說,some_lib_struct_t
只是一個指向actual_lib_struct_t
的指針。我做了以下更改:
extern crate libc;
struct actual_lib_struct_t;
type some_lib_type_t = *mut actual_lib_struct_t;
#[link(name="some_lib")]
extern {
fn some_lib_func(x: *mut some_lib_type_t);
}
fn main() {
let mut x: some_lib_type_t;
unsafe {
x = std::mem::uninitialized();
some_lib_func(&mut x);
}
}
它的工作原理!但是,我收到警告found zero-size struct in foreign module, consider adding a member to this struct, #[warn(improper_ctypes)] on by default
。這是我能壓制的東西嗎?還是我需要改變某些東西?
我得到它的工作使用MEM ::未初始化()。但是我收到了編譯器的警告。我用更多的信息更新了這個問題。 – EFTH
@EFTH我已經解決了這個問題。看到我的答案中關於「零尺寸」的部分。如果你有一個*不透明的指針*,那麼請看3個鏈接的問題。 – Shepmaster