내가 C 코드에서 수행하고자하는 내용은 다음과 같습니다녹 색 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);
}
}
I 컴파일 (그리 놀라 울) 오류를 얻을 : use of possibly uninitialized `x`
은.
편집 Shepmaster의 답변을 읽은 후 나는 라이브러리의 헤더에 가까워 보였다. 그들이 말했듯이, some_lib_struct_t
은 actual_lib_struct_t
에 대한 포인터의 typedef 일뿐입니다. 다음과 같이 변경했습니다.
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
을 얻는다. 이게 내가 억압 할 수있는 것입니까, 아니면 뭔가를 바꿀 필요가 있습니까?
unsafe {
let mut x: some_lib_struct_t = std::mem::uninitialized();
some_lib_func(&mut x);
}
당신에게 그 some_lib_func
완전히 확인해야합니다 :
let mut x: some_lib_struct_t = some_lib_struct_t;
unsafe {
some_lib_func(&mut x);
}
C 코드에 가장 가까운 아날로그 mem::uninitialized
가 사용하는 것입니다
:
많은 경우, C 라이브러리는 항상 불투명 타입에 대한 포인터를 반환하여 내부 구조체 표현을 노출되지 않도록 mem :: uninitialized(). 하지만 컴파일러로부터 경고를받습니다. 더 많은 정보로 질문을 업데이트했습니다. – EFTH
@EFTH 이미 언급했습니다. "제로 사이즈 (zero size)"에 대한 제 대답의 부분을보십시오. * 불투명 포인터 *가있는 경우 링크 된 3 개의 질문을 참조하십시오. – Shepmaster