常量指针的Rust FFI签名转换
我有一个带函数的C库,在不透明结构上运行,定义如下:常量指针的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
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