接口C++;带着锈迹斑斑的恐慌 我试图用C++调用一些用锈编写的函数。到目前为止,我已经相当成功了,但是在运行期间,我仍然有一个与CString相关的小问题

接口C++;带着锈迹斑斑的恐慌 我试图用C++调用一些用锈编写的函数。到目前为止,我已经相当成功了,但是在运行期间,我仍然有一个与CString相关的小问题,c++,rust,c-strings,C++,Rust,C Strings,函数hello应该获取一个输入字符串,将其与其他字符串连接起来并返回产品 这是我的乐趣。rs: 使用std::ffi::CString; #[没有损坏] 发布外部“C”fn添加(a:i32,b:i32)->i32{ a+b } #[没有损坏] 酒吧外部“C”fn你好(cs:CString)->CString{ 让slice=cs.to_str().unwrap(); 让mut s=“你好,”.to_string(); s=s+切片; CString::新建(&s[…])。展开()//运行时错误

函数
hello
应该获取一个输入字符串,将其与其他字符串连接起来并返回产品

这是我的
乐趣。rs

使用std::ffi::CString;
#[没有损坏]
发布外部“C”fn添加(a:i32,b:i32)->i32{
a+b
}
#[没有损坏]
酒吧外部“C”fn你好(cs:CString)->CString{
让slice=cs.to_str().unwrap();
让mut s=“你好,”.to_string();
s=s+切片;
CString::新建(&s[…])。展开()//运行时错误
//CString::new(cs).unwrap()//如果没有借用,则为空字符串
//cs//如果没有借钱的话可以用,但这不是我的意思
}
下面是
main.cpp

#包括
使用名称空间std;
外部“C”{
整数相加(整数a、整数b);
常量字符*hello(常量字符*x);
}
int main()
{
INTA,b;
cin>>a>>b;

coutRust的
CString
与C的
const char*
不兼容。以下是标准库中的
CString
的定义:

pub struct CString {
    inner: Box<[u8]>,
}
pub结构CString{
内:盒子,
}
类型是一个胖指针,即一个元组,其中包含指向切片项的指针以及作为
usize的切片长度

相反,您应该做的是让Rust函数接受一个
*const c_char
参数,然后用该指针作为参数调用以获得一个值


至于返回值,有一点问题:您的函数分配一个新字符串,然后返回指向它的指针。同样,您应该返回一个
*const c_char
,这可以通过调用连接的
CString
值来实现。但是为了避免内存泄漏,您还必须提供一个可以收回po的Rust函数通过
hello
返回inter并调用它,它将重新创建
CString
。然后
CString
的析构函数将运行,释放内存。

你能详细说明为什么你认为跨越FFI边界传递
CString
是安全的吗?还有@Shepmaster嗯,我的推理是如果我能通过
int32来回+如果
CString
可以很容易地进出(注释代码),那么它应该可以以某种方式工作。@Shepmaster URL就是答案。谢谢!
pub struct CString {
    inner: Box<[u8]>,
}