[英]Explaining C declarations in Rust
对于我正在处理的一系列实践问题,我需要在Go和Rust中重写这些C声明。 我想通了Go部分,但是在Rust部分遇到了麻烦。 有任何想法或帮助在Rust中编写这些想法吗?
答案取决于*
确切含义。 例如,是被用来作为一个指针数组与第一个double
S,或者是它的数组的数组double
S' 指针是否可以为空?
另外, n
为常数? 如果是,则需要一个数组。 如果不是,则需要Vec
。
另外,这些是全局还是局部声明? 它们是函数参数吗? 每种语法都有不同的语法。
坦白地说,没有更多的背景信息,就不可能准确地回答这个问题。 相反,我将为您提供以下内容:
Rust文档包含了您所需要的所有信息,尽管它散布了一些。 检查参考资料和任何外观合适的指南。 《 FFI指南》可能值得一看。
cdecl是一个网站,如果您遇到困难,它将取消选择C声明。 请注意,您必须删除分号和n
,否则它将无法解析。
Rust中的浮点类型为f32
和f64
,具体取决于您使用的是float
还是double
。 另外,请不要陷入困境:Rust中的int
不等同于C中的int
。建议使用显式大小的类型(例如i32
或u64
)或libc
类型(例如c_int
。 int
和uint
应该仅与显式指针大小的值一起使用。
通常,您会根据所需的可变性将对T
的引用编写为&T
或&mut T
(C中的默认值是可变的,Rust中的默认值是不可变的 )。
如果要使用可为空的引用,请使用Option<&T>
。
如果您试图在开始抱怨需要“一生”的环境中使用这些语言……那么,您将只需要学习该语言。 那时,简单的翻译将无法很好地工作。
拉斯特,数组类型被写入为围绕元件型支架。 因此,“ double
s数组”为[f64]
,大小为n
的数组为[f64, ..n]
n
[f64, ..n]
。 但是,通常, 实际上,等效于C中的double[]
是&[f64]
; 即是对数组的引用,而不是对数组的实际内容的引用。
在Rust中, 强烈建议不要使用“原始指针”,并且您不能在不安全的代码之外有意义地使用它们。 在语法上,指向T
的指针是*const T
或*mut T
,具体取决于它是指向常量还是可变数据的指针。
函数指针只是写为fn (Args...) -> Result
。 因此,什么都不做并返回双fn () -> f64
的函数将是fn () -> f64
。
假设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
块中允许使用外部函数声明(请参见FFI指南 )。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.