Преобразуване на Rust FFI Signature за const указатели

Имам 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);
}

но не знам кое е по-добро.


person Ed McCardell    schedule 21.05.2014    source източник


Отговори (1)


*T и *mut T не се различават един от друг; те са просто там като индикатори за намерение. Можете свободно да хвърляте между тях: x as *Foo.

person Chris Morgan    schedule 21.05.2014