我在C ++库上编写一个简单的Rust包装器。此库是使用本机int
类型编写的。而且我不知道通过生锈暴露这些API的最佳方法是什么。这里有两个注意事项:
库只是C ++代码的包装器,我们不负责检查int
大小。因此,只需在我们的高级接口中公开c_int
。
高级接口必须使用本机防锈类型,例如i32
,因此我们在任何地方使用它,同时通过某些静态检查int
是i32
健康检查如
#[allow(unused)]
fn assert_32_bit() {
let _: c_int = 0_i32;
}
后者只是禁止用户在int
i32
之内的任何地方使用此库。
我已阅读有关此问题的{nomicon意见(link),其意见如下:
需要对原始C API进行包装以提供内存安全性 使用更高级别的概念,如矢量。
但safe wrappers
的所有示例都使用int32_t
和类似的类型,这些类型很容易在Rust
类型系统上进行映射。
我应该采取哪种方法,为什么?关于这个问题,官方社区的立场是什么?
例如,这是示例C ++函数:
int sum(int a, int b);
我应该写
fn high_level_api_sum(a: c_int, b: c_int) { unsafe {sum(a, b)} }
或
fn high_level_api_sum(a: i32, b: i32) { unsafe {sum(a, b)} }
#[allow(unused)]
fn assert_32_bit() {
let _: c_int = 0_i32;
}
答案 0 :(得分:4)
我不认为 任何远程就像“官方”立场一样。以下是意见......或许表明这个问题首先不适合SO。
如果正确的类型为c_int
,请使用c_int
。 Rust程序员不应该非常脆弱,只要因为在接口中使用C类型到C / C ++库就会卷入胎儿位置。
问问自己:让您的用户受益让您锁定c_int
不是i32
的所有潜在平台(例如嵌入式平台)?
如果答案是“他们没有”,那么就不要这样做。如果他们做以某种方式受益,那么,你必须权衡自己锁定平台。也许使用c_int
会产生某种更广泛的界面问题。