c++rustvectorrust-bindgen

How to work with std_vector produced by rust bindgen


I have an external C++ library that I want to use from rust. For this I use bindgen to map the function calls. The C++ function I want to use fills a (C++) string vector and has the signature:

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

Bindgen generates the rust function:

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

Now I don't know how to handle this data type std_vector.

I tried to generate the std_vector struct and provide a raw pointer to it, which compiles but (of course) fails.

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

What is the correct way to handle this C++ data type. I haven't found any documentation about this topic.


Solution

  • What is the correct way to handle this C++ data type.

    There isn't one, as far as Rust is concerned, std::vector is an opaque type, even using it by value (not behind a pointer) is no bueno. It can only be created and manipulated through the API you provide.

    I would very strongly recommend against exposing any C++ type over a C API, that's a sure-fire way of shooting your foot up to the knee: C++ does not have a stable ABI, to say nothing of the stds (of which there are multiple non-ABI-compatible implementations), and C++'s implicit operations (e.g. copy / move ctor, dtor) will not get implicitly translated.

    If you exclusively want to communicate between C++ and Rust, you can instead use cxx, which provides bridges to std, which has bridges for several std types.