我需要在Go和Rust中重写这些C声明,以解决我正在处理的一系列练习问题。我想出了Go部分,但是我遇到了Rust部分的问题。有任何想法或帮助在Rust中写这些吗?
答案 0 :(得分:2)
答案取决于*
的确切含义。例如,第一个被用作指向double
的指针数组,还是一个double
s数组的数组?指针是否可以为空?
另外,n
是不变的?如果是,那么你想要一个数组;如果不是,你需要一个Vec
。
此外,还有这些全球或地方声明吗?它们是函数参数吗?每种语法都有不同的语法。
坦率地说,没有更多的背景,不可能可以准确地回答这个问题。相反,我会给你以下内容:
Rust documentation包含您需要的所有信息,尽管它有点分散。检查参考和任何适当的指南。 FFI Guide可能值得一看。
cdecl是一个网站,如果那是您遇到困难的部分,它将取消C声明。请注意,您必须删除分号和n
,否则它将无法解析。
Rust中的浮点类型为f32
和f64
,具体取决于您使用的是float
还是double
。此外,不要被抓住:Rust中的int
等同于C中的int
。首选显式大小的类型,例如i32
或{{1}来自u64
的类似libc
的类型。 c_int
和int
应仅与显式指针大小的值一起使用。
通常,您会将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)。