要向C发送Rust 对象,请执行以下操作:
#[no_mangle]
pub extern "C" fn create_foo() -> *mut Foo {
Box::into_raw(Box::new(Foo))
}
或者利用Box
是FFI安全的,与指针相同,而且只要ABI相同,Rust函数定义就不必与C头完全匹配:
#[no_mangle]
pub extern "C" fn create_foo() -> Box<Foo> {
Box::new(Foo)
}
(返回Option<Box<Foo>>
也可以,返回Result
也可以.)
要从C借钱(但不是免费的):
#[no_mangle]
pub unsafe extern "C" fn peek_at(foo: *mut Foo) {
let foo = foo.as_ref().unwrap(); // That's ptr::as_ref
}
或者利用参考资料和Option
家 foreign 金融机构的安全性:
#[no_mangle]
pub extern "C" fn peek_at(foo: Option<&mut Foo>) {
let foo = foo.unwrap();
}
接管/销毁之前交给C的Rust 物体:
#[no_mangle]
pub unsafe extern "C" fn free_foo(foo: *mut Foo) {
assert!(!foo.is_null());
Box::from_raw(foo); // Rust auto-drops it
}
或者使用Option<Box>
是FFI安全的,并且由Rust管理的内存:
#[no_mangle]
pub unsafe extern "C" fn free_foo(foo: Option<Box<Foo>>) {
// dropped implicitly
}