常量指针的Rust FFI签名转换

常量指针的Rust FFI签名转换,ffi,rust,Ffi,Rust,我有一个带函数的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

我有一个带函数的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);
}
而且确实存在一个错误
不匹配的类型:预期为'*Foo',但发现'*mutfoo'(值的可变性不同)

翻译这些类型的C函数签名的推荐方法是什么

似乎有效的方法是将参数类型更改为
*mut Foo
,或者使用transmute:

unsafe {
    let x = makeFoo();
    // Do some stuff with x
    let cx: *Foo = mem::transmute(x);
    let y = dupFoo(cx);
}

但是我不知道哪一个更好。

*t
*mut
没有区别;它们只是作为意图的标志。您可以在它们之间自由转换:
x as*Foo