在Rust中,如何从第三方库定义或导入C结构体?

前端之家收集整理的这篇文章主要介绍了在Rust中,如何从第三方库定义或导入C结构体?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
Rust FFI指南( http://static.rust-lang.org/doc/master/guide-ffi.html)很好地演示了如何导入使用由Rust std :: lib库(例如size_t)包装的标准C类型的C函数.但是如何将第三方库中定义的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);
    }
}

解决方法

使用空结构是一种有效的方法.你几乎可以得到它,你不需要把结构定义放在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);
    }
}
原文链接:https://www.f2er.com/c/113187.html

猜你在找的C&C++相关文章