Rust FFI指南(http://static.rust-lang.org/doc/master/guide-ffi.html)很好地演示了如何导入使用Rust std::lib库包装的标准C类型的C函数,例如size_t.但如何将第三方库中定义的C数据 struct 引入到Rust程序中呢?

我正在使用libmemcached,它有以下功能:

memcached_st* memcached_create(memcached_st *ptr)

通常在C程序中这样调用(以启动程序):

#include <libmemcached/memcached.h>
// ...
memcached_st *memc;
memc = memcached_create(NULL);

memcached_st是一个不透明的C struct ——我如何在Rust程序中声明和使用它?以下是我迄今为止失败的try :

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

推荐答案

使用空 struct 是一种有效的方法.你几乎就知道了,你不需要把 struct 定义放在extern块里.此外,不能在Rust源代码中使用C代码——外部定义必须遵循标准的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);
    }
}

Rust相关问答推荐

捕获Rust因C++异常而产生panic

如果A == B,则将Rc A下推到Rc B

这种获取-释放关系是如何运作的?

如何使用syn插入 comments ?

在跨平台应用程序中使用std::OS::Linux和std::OS::Windows

在IntoIter上调用.by_ref().Take().rev()时会发生什么情况

在Rust中判断编译时是否无法访问

失真图像图形捕获Api

是否可以使用Serde/Rust全局处理无效的JSON值?

当我编译 Rust 代码时,我是否缺少 AVX512 的目标功能?

如何处理闭包中的生命周期以及作为参数和返回类型的闭包?

仅在使用 &mut 或线程时borrow 的数据在闭包之外转义?

Rust 异步循环函数阻塞了其他future 任务的执行

如何刷新 TcpStream

不能将 `*self` borrow 为不可变的,因为它也被borrow 为可变的 - 编译器真的需要如此严格吗?

将 `&T` 转换为新类型 `&N`

为什么-x试图解析为文字并在声明性宏中失败?

在 Rust 中有条件地导入?

如何将 while 循环内的用户输入添加到 Rust 中的向量?

如何迭代调用可能会失败的函数?操作员?