В 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);
    }
}