库是否应该向消费者公开 c_int 或强制 i32 兼容性

Ale*_*kiy 5 rust

我正在通过 C++ 库编写一个简单的 Rust 包装器。这个库是使用本机int类型编写的。而且我不知道通过 rust 公开这些 API 的最佳方法是什么。这里我们有两个考虑:

  1. 库只是 C++ 代码的包装器,检查int大小不是我们的责任。因此,只需c_int在我们的高级接口中公开即可。

  2. 高层次的接口必须使用原生锈类型,比如i32所以我们用它无处不在,而静态检查inti32通过像一些健康检查

#[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)

DK.*_*DK. 4

我认为在这方面没有任何类似于“官方”立场的东西接下来是意见...也许首先表明这个问题不适合SO。

如果类型正确c_int,请使用c_int. Rust 程序员不应该如此脆弱,以至于仅仅因为您在C/C++ 库的接口中使用了 C 类型,他们就陷入了胎儿状态。

问问自己:您的用户是否会从您锁定所有潜在平台而不是锁定平台(例如嵌入式平台)中受益?c_inti32

如果答案是“他们不这样做”,那就不要这样做。如果他们确实某种方式受益,那么你就必须权衡这一点与自己锁定平台的关系。也许使用会c_int带来某种更广泛的接口问题。