[英]How to place a C struct on the function stack in Rust?
我想轉以下C代碼
HMAC_CTX context;
HMAC_CTX_init(&context);
進入 Rust。 但是,雖然定義外部 function 很容易,但在 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 綁定。 如果放置在構建腳本中,它將生成相應 C 結構的 rust 版本並保持同步。
增加了構建過程的復雜性並增加了依賴。
手動創建 C 結構的 Rust 版本。
#[repr(C)]
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 結構。 還可能需要定義進一步的結構。 向被調用庫的內部添加依賴項:-(
創建一個占位符結構。
pub struct HMAC_CTX {
_placeholder: [c_uchar; 256],
}
該結構需要足夠大以容納 C 結構的所有內部結構。 間接依賴:-( 如果 C 結構大小超過占位符大小,則可能導致不安全行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.