如何在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结构?的主要内容,如果未能解决你的问题,请参考以下文章