解释Rust中的C声明

时间:2014-12-02 04:54:27

标签: pointers rust

我需要在Go和Rust中重写这些C声明,以解决我正在处理的一系列练习问题。我想出了Go部分,但是我遇到了Rust部分的问题。有任何想法或帮助在Rust中写这些吗?

  1. double * a [n];
  2. double(* b)[n];
  3. double(* c [n])();
  4. double(* d())[n];

2 个答案:

答案 0 :(得分:2)

答案取决于*的确切含义。例如,第一个被用作指向double的指针数组,还是一个double s数组的数组?指针是否可以为空?

另外,n是不变的?如果是,那么你想要一个数组;如果不是,你需要一个Vec

此外,还有这些全球或地方声明吗?它们是函数参数吗?每种语法都有不同的语法。

坦率地说,没有更多的背景,不可能可以准确地回答这个问题。相反,我会给你以下内容:

  • Rust documentation包含您需要的所有信息,尽管它有点分散。检查参考和任何适当的指南。 FFI Guide可能值得一看。

  • cdecl是一个网站,如果那是您遇到困难的部分,它将取消C声明。请注意,您必须删除分号和n,否则它将无法解析。

  • Rust中的浮点类型为f32f64,具体取决于您使用的是float还是double。此外,不要被抓住:Rust中的int 等同于C中的int。首选显式大小的类型,例如i32或{{1}来自u64的类似libc的类型。 c_intint与显式指针大小的值一起使用。

  • 通常,您会将uint的引用写为T&T,具体取决于所需的可变性(C中的默认值是可变的,Rust中的默认值为< EM>不可变)。

  • 如果您想要一个可以为空的引用,请使用&mut T

  • 如果你试图在你开始抱怨需要“生命周期”的情况下使用这些......那么,你只需要学习这门语言。那时,简单的翻译不会很好。

  • 在Rust中,数组类型被写为括号 元素类型。因此,“Option<&T> s数组”将为double,大小为[f64]的数组将为n。但是,通常情况下,实际等同于C中的[f64, ..n]double[];也就是说,对数组的引用,而不是数组的实际内容

  • 在Rust中不鼓励使用“原始指针” ,并且你不能在不安全的代码之外有意义地使用它们。在语法方面,指向&[f64]的指针为T*const T,具体取决于它是指向常量数据还是可变数据的指针。

  • 函数指针只写为*mut T。因此,一个不带任何东西并返回double的函数将是fn (Args...) -> Result

答案 1 :(得分:2)

假设n是常数:

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];

这些在任何语言中都是相当尴尬和不寻常的类型。但是,Rust的语法使得这些声明比C语法更容易阅读。

请注意,C中的d是函数声明。在Rust中,只允许在extern块中使用外部函数声明(参见the FFI guide)。