ps4 - En Rust, ¿cómo puedo definir o importar una estructura C de una biblioteca de terceros?
rust traduccion (1)
Usar una estructura vacía es un enfoque válido. Casi lo tienes, simplemente no necesitas poner la definición de la estructura en un bloque extern
. Además, no puede utilizar el código C dentro de las fuentes de Rust: las definiciones externas deben seguir la sintaxis estándar de 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);
}
}
La guía de Fust de Rust ( http://static.rust-lang.org/doc/master/guide-ffi.html ) muestra muy bien cómo importar funciones de C que usan tipos de C estándar que se incluyen en la biblioteca Rust std::lib
, como size_t
. Pero, ¿cómo llevo las estructuras de datos de C definidas en bibliotecas de terceros a un programa Rust?
Estoy trabajando con libmemcached , que tiene la siguiente función:
memcached_st* memcached_create(memcached_st *ptr)
que normalmente se invoca como tal en un programa de C (para comenzar):
#include <libmemcached/memcached.h>
// ...
memcached_st *memc;
memc = memcached_create(NULL);
El memcached_st
es una estructura en C opaca: ¿cómo declaro y uso eso en un programa Rust? Aquí están mis intentos fallidos hasta ahora:
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);
}
}
y
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);
}
}