如何使用 rust bindgen 生成的 std_vector

Udo*_*rth 2 c++ vector rust rust-bindgen

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

short REQ_MList(std::vector<std::string> *list)
Run Code Online (Sandbox Code Playgroud)

Bindgen 生成 Rust 函数:

pub fn REQ_MList(list: *mut std_vector) -> ::std::os::raw::c_short
Run Code Online (Sandbox Code Playgroud)

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

我尝试生成 std​​_vector 结构并提供指向它的原始指针,该指针可以编译但(当然)失败。

let mut list=std_vector{_Mypair: (0)};
let list_ptr:*mut std_vector= &mut list;
REQ_MList(listptr);
Run Code Online (Sandbox Code Playgroud)

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

Mas*_*inn 6

处理此 C++ 数据类型的正确方法是什么?

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

我强烈建议不要在 C API 上暴露任何 C++ 类型,这肯定会导致你的膝盖受伤:C++ 没有稳定的 ABI,更不用说 stds(其中有多个)。非 ABI 兼容的实现),并且 C++ 的隐式操作(例如复制/移动 ctor、dtor)将不会得到隐式翻译。

如果您只想在 C++ 和 Rust 之间进行通信,则可以使用cxx,它提供了到 std 的桥梁,而 std 具有用于多种 std 类型的桥梁。