首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Rust解释C声明

用Rust解释C声明
EN

Stack Overflow用户
提问于 2014-12-02 04:54:26
回答 2查看 293关注 0票数 1

我需要用Go和Rust重写这些C声明,以解决我正在处理的一系列实践问题。我想出了围棋部分,但我对铁锈部分有困难。有什么想法或帮助写这些铁锈吗?

  1. 双*安;
  2. 双(*b)n;
  3. 双(*cn)();
  4. 双(*d())n;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-02 05:30:18

假设n是一个常量:

代码语言:javascript
复制
let a: [*mut f64, ..n];           // double *a[n];
let b: *mut [f64, ..n];           // double (*b)[n];
let c: [fn() -> f64, ..n];        // double (*c[n])();
fn d() -> *mut [f64, ..n];        // double (*d())[n];

在任何语言中,这些都是相当尴尬和不寻常的类型。然而,铁锈的语法使这些声明比C的语法更易于阅读。

注意,C中的d是一个函数声明。在Rust中,只允许在extern块中声明外部函数(参见FFI指南)。

票数 2
EN

Stack Overflow用户

发布于 2014-12-02 05:22:57

答案取决于*到底是干什么用的。例如,第一个被用作指向double的指针数组,还是double的数组?指针是否为空?

另外,n是一个常数还是非常数?如果是,则需要一个数组;如果不是,则需要一个Vec

此外,这些是全局声明还是本地声明?它们是函数论点吗?每种方法都涉及不同的语法。

坦率地说,没有更多的上下文,就不可能准确地回答这个问题。相反,我会给你以下几点:

  • 锈病文献包含了您所需要的所有信息,尽管它稍微分散了一些。检查参考资料和任何适当的外观指南。FFI指南可能值得一看。
  • cdecl是一个网站,如果这是你有困难的部分,它将取消C声明。请注意,您必须删除分号和n,否则它将不会解析。
  • 锈蚀中的浮点类型是f32f64,这取决于您是在使用float还是double。另外,不要被捕捉到:int in Rust 并不等同于C中的int。更喜欢显式大小的类型,比如i32u64,或者来自libc的类型,比如c_intintuint应该只使用和显式指针大小的值。
  • 通常,您会将对T的引用编写为&T&mut T,这取决于所需的可更改性(C中的默认值是可变的,默认的是Rust是不可变的)。
  • 如果需要可空引用,请使用Option<&T>
  • 如果你试图在你开始抱怨需要“生命周期”的环境中使用这些.好吧,你只需要学习这门语言。在这一点上,简单的翻译不会有很好的效果。
  • 在Rust中,数组类型被写成元素类型周围的括号。因此,“double的数组”将是[f64],大小的n数组将为[f64, ..n]。但是,通常情况下,C中的double[]的实际等效值是&[f64];也就是说,是对数组的引用,而不是数组的实际内容。
  • 在Rust中,“原始指针”的使用是非常不受欢迎的,您不能在不安全的代码之外有意义地使用它们。在语法方面,指向T的指针是*const T还是*mut T,这取决于它是指向常量数据还是可变数据的指针。
  • 函数指针只是作为fn (Args...) -> Result编写的。因此,一个不需要任何东西并返回一个double的函数就是fn () -> f64
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27242122

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档