针对const指针的Rust FFI签名转换

时间:2014-05-21 23:08:40

标签: 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 = 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);
}

但我不知道哪个更好。

1 个答案:

答案 0 :(得分:1)

*T*mut T彼此没有什么不同;它们只是作为意图的指标。您可以在它们之间自由施放:x as *Foo