我有一个非常基本的Rust函数编译好:
use std;
use std::ffi::CString;
use std::os::raw::c_char;
#[no_mangle]
pub extern "C" fn string_from_rust() -> [*const c_char; 2] {
let s = CString::new("Hello").unwrap();
let t = CString::new("World").unwrap();
let p = s.as_ptr();
let w = t.as_ptr();
std::mem::forget(s);
std::mem::forget(t);
[p, w]
}
在我的C头文件中,我加入了
#include <stdint.h>
extern char * string_from_rust();
string_from_rust()
只返回“Hello”,所以我似乎做错了,大概是在C中,只允许将Rust数组的第一个元素传递给C.
答案 0 :(得分:1)
C ABI没有&#34;返回数组&#34;的概念。您应该分配一个Vec<*const c_char>
并将其返回,将C侧的函数定义为extern char** string_from_rust()
。
或者,因为要返回两个指针,所以使用带有两个成员而不是数组的#[repr(C)]
结构。