Rust 关于与 C++ 互操作性的官方指南是什么,特别是作为参数传递和返回结构?

15 c c++ rust

我正在尝试调整现有 C++ 代码的某些层以供 Rust 使用,显然方法是通过 C API。

例如,一个函数可能返回一个结构作为对象

#pragma pack(push,4)
struct Result {
    char ch;
    int32_t sum1;
    int32_t sum2;
};
#pragma pack(pop)

extern "C"
Result
muladd(int32_t a, int32_t b, int32_t c) {
    return Result{1, a+b*c, a*b+c};
}
Run Code Online (Sandbox Code Playgroud)

我正在做的 Rust

#[repr(C,align(4))]
pub struct Result {
    pub ch: i8,
    pub sum1: i32,
    pub sum2: i32,
}

extern "C" {
    pub fn muladd( a:i32, b:i32, c:i32 ) -> Result;
}

pub fn usemuladd( val: i32 ) -> i32 {
    unsafe {
       let res = muladd( val, val, val );
       return res.sum1;
    }
}
Run Code Online (Sandbox Code Playgroud)

我在结构的对齐和包装方面看到了奇怪的结果。我读到 Rust 可以使用结构,但排序或打包都不能得到保证。

看来使用#[repr(C)]andextern "C"是实现良好兼容层的关键。那么我的问题是:我可以相信这两个能让我顺利通过,还是总会有一些我不得不担心的未宣布的边缘情况?

https://godbolt.org/z/aEh4jKxxf

Sol*_*cko 4

extern "C"两侧+ #[repr(C)]Rust 侧+仅使用 C 兼容类型进行 C++ 和 Rust 之间的接口,应该可以。

或者,请参阅cxxautocxx