库应该将c_int暴露给消费者还是强制i32兼容

时间:2018-02-14 13:20:38

标签: rust

我在C ++库上编写一个简单的Rust包装器。此库是使用本机int类型编写的。而且我不知道通过生锈暴露这些API的最佳方法是什么。这里有两个注意事项:

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

  2. 高级接口必须使用本机防锈类型,例如i32,因此我们在任何地方使用它,同时通过某些静态检查inti32健康检查如

  3. #[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;
    }
    

1 个答案:

答案 0 :(得分:4)

我不认为 任何远程就像“官方”立场一样。以下是意见......或许表明这个问题首先不适合SO。

如果正确的类型为c_int,请使用c_int。 Rust程序员不应该非常脆弱,只要因为在接口中使用C类型到C / C ++库就会卷入胎儿位置。

问问自己:让您的用户受益让您锁定c_int不是i32的所有潜在平台(例如嵌入式平台)?

如果答案是“他们没有”,那么就不要这样做。如果他们以某种方式受益,那么,你必须权衡自己锁定平台。也许使用c_int会产生某种更广泛的界面问题。