定义表示不透明 C 结构的 Rust 类型的交叉编译安全方式,其大小在编译时已知

Cross-compile-safe way of defining a Rust type representing an opaque C struct whose size is known at compile-time

我需要定义一个 Rust 类型来反映一个不透明的 C 结构,其大小和对齐要求在编译时是已知的。一位乐于助人的人建议我生成类似

的代码
#[repr(C, align($ALIGNMENT_GOES_HERE))]
pub struct Foo(std::mem::MaybeUninit<[u8; $SIZE_GOES_HERE]>);

来自 C 程序,$SIZE_GOES_HERE 和朋友根据我从那里确定的内容填写。这很好用,但如果大小和对齐依赖于平台,则在交叉编译的情况下一点也不健壮。

有什么可靠的解决方案吗? cc 箱子看起来很有前途。

特定目标架构的给定结构的大小和对齐由结构的布局和目标架构的 ABI 决定。

如果 Rust 没有结构的布局,那么它就无法确定其大小或对齐方式——因此必须明确提供此信息。

但是,由于此信息是依赖于目标的,因此在编译之前提供它会将可能的目标限制为已经硬编码的目标(例如,通过不同的定义,通过条件编译选择)。

相反,如果需要,有一个名为 bindgen that can automatically generate the appropriate Rust binding from the C header file as a build step at compilation-time. It can be configured to treat a type as an opaque blob of bytes 的官方工具。