繁体   English   中英

在Rust中解释C声明

[英]Explaining C declarations in Rust

对于我正在处理的一系列实践问题,我需要在Go和Rust中重写这些C声明。 我想通了Go部分,但是在Rust部分遇到了麻烦。 有任何想法或帮助在Rust中编写这些想法吗?

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

答案取决于*确切含义。 例如,是被用来作为一个指针数组与第一个double S,或者是它的数组的数组double S' 指针是否可以为空?

另外, n为常数? 如果是,则需要一个数组。 如果不是,则需要Vec

另外,这些是全局还是局部声明? 它们是函数参数吗? 每种语法都有不同的语法。

坦白地说,没有更多的背景信息,就不可能准确地回答这个问题。 相反,我将为您提供以下内容:

  • Rust文档包含了您所需要的所有信息,尽管它散布了一些。 检查参考资料和任何外观合适的指南。 FFI指南》可能值得一看。

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

  • Rust中的浮点类型为f32f64 ,具体取决于您使用的是float还是double 另外,请不要陷入困境:Rust中的int 等同于C中的int 。建议使用显式大小的类型(例如i32u64 )或libc类型(例如c_int intuint应该与显式指针大小的值一起使用。

  • 通常,您会根据所需的可变性将对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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM