首页 文章

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

提问于
浏览
2

我有一个带有函数的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 回答

  • 1

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

相关问题