如何在Rust中的函数堆栈上放置C结构?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Rust中的函数堆栈上放置C结构?相关的知识,希望对你有一定的参考价值。

我想转移以下C代码

HMAC_CTX context;
HMAC_CTX_init(&context);

进入Rust。但是,尽管定义外部函数很容易,但似乎不可能直接在Rust中使用C结构。

extern "C" 
  use HMAC_CTX; // does not work!
  fn HMAC_CTX_init(ctx: *mut HMAC_CTX);

我知道我可以在Rust中定义一个占位符结构

struct HMAC_CTX;

...但是的实例可能没有足够的空间容纳真正的C结构。

let mut ctx = HMAC_CTX;
unsafe  HMAC_CTX_init(&mut ctx); 

是否有一种方法可以解决此问题,而无需在Rust中重新定义整个结构?这将创建从外部代码到我的Rust项目的依赖关系,我想避免这种情况。

答案

使用rust-bindgen生成Rust绑定。如果放置在build-script中,它将生成相应C结构的rust版本,并使其保持同步。

[增加了构建过程的复杂性并增加了依赖性。

另一答案

手动创建C结构的Rust版本。

pub struct HMAC_CTX 
  md: *mut EVP_MD,
  md_ctx: EVP_MD_CTX,
  i_ctx: EVP_MD_CTX,
  o_ctx: EVP_MD_CTX,
  key_length: c_uint,
  key: [c_uchar; 128],

这需要遵循更改C代码并手动更新Rust结构的操作。此外,还必须定义其他结构。将依赖项添加到所调用库的内部:-(

以上是关于如何在Rust中的函数堆栈上放置C结构?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 C typedef 结构和函数与 Rust 中的结构一起使用?

如何在 Rust 中传递对可变数据的引用?

如何在 C++ 中使用堆栈 [关闭]

如何增加 Rust 库可用的堆栈大小?

如何在堆栈中将文本放置在图像上?

如何在 Rust 中表示指向 C 数组的指针?