Rust 库应该向使用者公开c_int还是强制i32兼容 我在C++库上写了一个简单的锈包装器。这个库是用nativeint类型编写的。我不知道通过生锈来暴露这些API的最佳方法是什么。这里我们有两个考虑:
库只是C++代码的包装器,检查<代码> int >代码>大小不是我们的响应能力。因此,只需在我们的高级接口中公开Rust 库应该向使用者公开c_int还是强制i32兼容 我在C++库上写了一个简单的锈包装器。这个库是用nativeint类型编写的。我不知道通过生锈来暴露这些API的最佳方法是什么。这里我们有两个考虑:,rust,Rust,库只是C++代码的包装器,检查 int >代码>大小不是我们的响应能力。因此,只需在我们的高级接口中公开c_int 高级接口必须使用本机生锈类型,例如i32,因此我们在任何地方都使用它,同时通过一些类似的healthcheck静态检查int是否为i32 #[允许(未使用)] fn断言32位(){ 设u:c_int=0_i32; } 后者只是禁止用户在int不是i32的任何地方使用此库 我已经阅读了nomicon关于这个问题的意见(),其意见是: 原始的C API需要包装以提供内存安全性和 使用
c_int
i32
,因此我们在任何地方都使用它,同时通过一些类似的healthcheck静态检查int
是否为i32
#[允许(未使用)]
fn断言32位(){
设u:c_int=0_i32;
}
后者只是禁止用户在int
不是i32
的任何地方使用此库
我已经阅读了nomicon关于这个问题的意见(),其意见是:
原始的C API需要包装以提供内存安全性和
使用更高级的概念,如向量
但是,所有带有安全包装的示例都使用int32\u t
和类似类型,这些类型很容易映射到Rust
类型系统
我应该采取哪种方法,为什么?社区对这个问题的官方立场是什么
例如,这里是样本C++函数:
intsum(inta,intb);
我应该写信吗
fn高级api_sum(a:c_int,b:c_int){safe{sum(a,b)}
或
fn高级api和(a:i32,b:i32){safe{sum(a,b)}
#[允许(未使用)]
fn断言32位(){
设u:c_int=0_i32;
}
我不认为在这方面有任何类似“官方”的立场。下面是我的看法。。。首先,也许提出这个问题并不适合这样做
如果正确的类型是c_int
,请使用c_int
。Rust程序员不应该因为在C/C++库的接口中使用C类型而变得如此脆弱,以至于陷入胎儿状态
扪心自问:如果您锁定了c_int
不是i32
的任何和所有潜在平台(例如嵌入式平台),您的用户会从中受益吗
如果答案是“他们没有”,那么就不要这样做。如果他们真的从某种程度上受益,那么,你就必须将其与自己锁定平台进行权衡。也许使用c\u int
会带来一些更广泛的接口问题。我认为您不需要assert\u 32位
——如果您试图在int
为64位的平台上使用包装器编译i32
,这本身不是一个编译错误吗?@trentcl您是对的,但在您的情况下,i32
不是c_int
的每个地方都会出现N个错误。另一方面,我们可以将assert_32_bit
放在一个地方,例如build.rs
,并且在尝试构建任何内容之前,只有一个自描述性错误:)