Rust 库应该向使用者公开c_int还是强制i32兼容 我在C++库上写了一个简单的锈包装器。这个库是用nativeint类型编写的。我不知道通过生锈来暴露这些API的最佳方法是什么。这里我们有两个考虑:

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 >代码>大小不是我们的响应能力。因此,只需在我们的高级接口中公开
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
    ,并且在尝试构建任何内容之前,只有一个自描述性错误:)