我正在尝试调整现有 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"
是实现良好兼容层的关键。那么我的问题是:我可以相信这两个能让我顺利通过,还是总会有一些我不得不担心的未宣布的边缘情况?
归档时间: |
|
查看次数: |
1704 次 |
最近记录: |