В Rust как я могу определить или импортировать C-структуру из сторонней библиотеки?
Руководство RFI Rust (http://static.rust-lang.org/doc/master/guide-ffi.html) прекрасно демонстрирует, как импортировать функции C, которые используют стандартные типы C, которые обернуты библиотекой Rust std::lib
, например как size_t
. Но как мне привести структуры данных C, определенные в сторонних библиотеках, в программу Rust?
Я работаю с libmemcached, который имеет следующую функцию:
memcached_st* memcached_create(memcached_st *ptr)
который, как правило, вызывается в программе C (чтобы отключить игру):
#include <libmemcached/memcached.h>
// ...
memcached_st *memc;
memc = memcached_create(NULL);
memcached_st
- непрозрачная структура C - как я объявляю и использую это в программе Rust? Вот мои неудачные попытки:
use std::libc::*;
use ptr;
#[link(name = "memcached")]
extern {
struct memcached_st; // error: unexpected token: `struct`
memcached_st* memcached_create(memcached_st *ptr);
}
fn main() {
unsafe {
let memc = memcached_create(ptr:null());
println!("{:?}", memc);
}
}
и
use std::libc::*;
use ptr;
#[link(name = "memcached")]
extern {
// error: unexpected token: `memcached_st`
memcached_st* memcached_create(memcached_st *ptr);
}
fn main() {
unsafe {
let memc = memcached_create(ptr:null());
println!("{:?}", memc);
}
}
Ответы
Ответ 1
Использование пустой структуры является допустимым подходом. Вы почти получили его, вам просто не нужно указывать определение структуры в блоке extern
. Также вы не можете использовать код C внутри источников Rust - определения extern должны соответствовать стандартным синтаксическим синтаксическим воздействиям Rust.
use std::ptr;
struct memcached_st;
#[link(name = "memcached")]
extern {
fn memcached_create(ptr: *memcached_st) -> *memcached_st;
}
fn main() {
unsafe {
let memc = memcached_create(ptr::null());
println!("{:?}", memc);
}
}