【问题标题】:How to work with std_vector produced by rust bindgen如何使用 rust bindgen 生成的 std_vector
【发布时间】:2023-02-24 21:02:08
【问题描述】:

我有一个外部 C++ 库,我想从 Rust 中使用它。为此,我使用 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 结构并提供一个指向它的原始指针,它编译但(当然)失败。

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

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

【问题讨论】:

    标签: c++ rust vector rust-bindgen


    【解决方案1】:

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

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

    我强烈建议不要通过 C API 公开任何 C++ 类型,这是一种让你的脚踢到膝盖的可靠方法:C++ 没有稳定的 ABI,更不用说 stds(其中有多个非 ABI 兼容的实现)和 C++ 的隐式操作(例如复制/移动 ctor、dtor)将不是得到隐式翻译。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-11
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 2021-09-15
      • 2018-03-21
      • 2021-03-22
      • 2020-05-12
      相关资源
      最近更新 更多