我有一个带有函数的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);
}
但我不知道哪个更好。
答案 0 :(得分:1)
*T
和*mut T
彼此没有什么不同;它们只是作为意图的指标。您可以在它们之间自由施放:x as *Foo
。