Имам C библиотека с функции, работещи върху непрозрачна структура, дефинирана така:
Foo* makeFoo(); // create a new Foo
Foo* dupFoo(const Foo* orig); // make a duplicate Foo
rust-bindgen
създава тези външни дефиниции:
pub fn makeFoo() -> *mut Foo;
pub fn dupFoo(orig: *Foo) -> *mut Foo;
Сега не очаквам следното да работи:
unsafe {
let x = makeFoo();
// Do some stuff with x
let y = dupFoo(x);
}
и наистина има грешка mismatched types: expected '*Foo' but found '*mut Foo' (values differ in mutability)
Какъв е препоръчителният начин за справяне с превода на тези типове C функционални подписи?
Това, което изглежда работи, е или промяна на типовете параметри -- дори когато C функцията използва const
-- до *mut Foo
, или използване на transmute:
unsafe {
let x = makeFoo();
// Do some stuff with x
let cx: *Foo = mem::transmute(x);
let y = dupFoo(cx);
}
но не знам кое е по-добро.