我有一个外部C++库,我想从Ruust中使用它.为此,我使用bindgen来映射函数调用.我要使用的C++函数填充(C++)字符串向量,并具有签名:

short REQ_MList(std::vector<std::string> *list)

Bindgen生成Rust函数:

pub fn REQ_MList(list: *mut std_vector) -> ::std::os::raw::c_short

现在我不知道如何处理这个数据类型STD_VECTOR.

我试图生成STD_VECTOR struct 并提供指向它的原始指针,编译后(当然)失败了.

let mut list=std_vector{_Mypair: (0)};
let list_ptr:*mut std_vector= &mut list;
REQ_MList(listptr);

处理这种C++数据类型的正确方式是什么?我还没有找到关于这个主题的任何文档.

推荐答案

处理这种C++数据类型的正确方式是什么?

没有一个,就Rust而言,std::vector是一个不透明的类型,即使通过值(而不是在指针后面)使用它也不是很好.只能通过您提供的API创建和操作.

我强烈建议不要在C API上公开任何C++类型,这是一种非常有效的方法:C++没有稳定的ABI,更不用说STD(有多个非ABI兼容的实现),并且C++的隐式操作(例如复制/移动ctor、dtor)将not被隐式转换.

如果您只想在C++和Rust之间进行通信,您可以使用cxx,它提供了到STD的桥,而STD有几种STD类型的桥.

Rust相关问答推荐

有条件默认实现

为什么函数不接受选项T参数的所有权?

我怎样才能从一个Rust 的日期中go 掉3年?

当两者都有效时,为什么Rust编译器建议添加';&;而不是';*';?

在Rust中,在实现特征`Display`时,如何获取调用方指定的格式?

重写Rust中的方法以使用`&;mut self`而不是`mut self`

告诉Rust编译器返回值不包含构造函数中提供的引用

在Rust中判断编译时是否无法访问

零拷贝按步骤引用一段字节

期望一个具有固定大小 x 元素的数组,找到一个具有 y 元素的数组

仅发布工作区的二进制 crate

Google chrome 和 Apple M1 中的计算着色器

Rust编译器通过哪些规则来确保锁被释放?

如何创建递归borrow 其父/创建者的 struct ?

通用类型,不同于输入类型,作为函数的返回值

在 Rust 中组合特征的不同方法是否等效?

为什么这里需要类型注解?

在同一向量 Rust 中用另一个字符串扩展一个字符串

守卫如何影响匹配语句?

为什么 Rust 中的关联类型需要明确的生命周期注释?