2014-03-01 24 views
15

Rust FFI指南(http://static.rust-lang.org/doc/master/guide-ffi.html)很好地演示瞭如何導入使用由Rust std::lib庫包裝的標準C類型(如size_t)的C函數。但是,如何將第三方庫中定義的C數據結構帶入Rust程序?Rust中如何定義或從第三方庫導入C結構體?

我與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); 
    } 
} 
+0

我相信使用空的枚舉通常比單位結構更受歡迎,因爲這樣就沒有構造函數了。除此之外,這很重要。 –

回答

19

使用空的結構是一種有效的方法。你幾乎可以得到它,你只需要將結構定義放在extern塊中即可。你也不能在Rust源代碼中使用C代碼 - 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); 
    } 
} 
+0

更新到當前的鏽編譯器(向指針添加「const」)後,會立即警告有關improper_ctypes –