我正在通过 C++ 库编写一个简单的 Rust 包装器。这个库是使用本机int类型编写的。而且我不知道通过 rust 公开这些 API 的最佳方法是什么。这里我们有两个考虑:
库只是 C++ 代码的包装器,检查int大小不是我们的责任。因此,只需c_int在我们的高级接口中公开即可。
高层次的接口必须使用原生锈类型,比如i32所以我们用它无处不在,而静态检查int是i32通过像一些健康检查
#[allow(unused)]
fn assert_32_bit() {
let _: c_int = 0_i32;
}
Run Code Online (Sandbox Code Playgroud)
后者只是禁止用户在任何地方使用这个库int不是i32。
我已经阅读了关于这个问题的 nomicon 意见(链接),它的意见是:
需要包装原始 C API 以提供内存安全并利用更高级别的概念,如向量。
但是所有示例safe wrappers都使用了int32_t类似的类型,这些类型很容易映射到Rust类型系统上。
我应该采用哪种方法,为什么?官方社区对此问题的立场是什么?
例如,这里是示例 C++ 函数:
int sum(int a, int b);
Run Code Online (Sandbox Code Playgroud)
我应该写吗
fn high_level_api_sum(a: c_int, b: c_int) { unsafe {sum(a, b)} }
Run Code Online (Sandbox Code Playgroud)
或者
fn high_level_api_sum(a: i32, b: i32) { unsafe {sum(a, b)} }
#[allow(unused)]
fn assert_32_bit() {
let _: c_int = 0_i32;
}
Run Code Online (Sandbox Code Playgroud)
我认为在这方面没有任何类似于“官方”立场的东西。接下来是意见...也许首先表明这个问题不适合SO。
如果类型正确c_int,请使用c_int. Rust 程序员不应该如此脆弱,以至于仅仅因为您在C/C++ 库的接口中使用了 C 类型,他们就陷入了胎儿状态。
问问自己:您的用户是否会从您锁定所有潜在平台而不是锁定平台(例如嵌入式平台)中受益?c_inti32
如果答案是“他们不这样做”,那就不要这样做。如果他们确实以某种方式受益,那么你就必须权衡这一点与自己锁定平台的关系。也许使用会c_int带来某种更广泛的接口问题。