#offset #padding #struct-fields #no-alloc

无标准库 autopad

定义具有偏移字段的结构体

1 个稳定版本

1.0.0 2023年2月24日

#432无标准库

MIT/Apache

10KB
181

autopad

添加了 autopad! 过程宏,允许定义具有指定偏移量的字段的结构体。

autopad!(

#[repr(C)] // Needed to preserve field orders
struct WithPadding {
    root: u8, // At offset 0x0
    0x100 => partway_in: u32,
    after_offset: u32, // At 0x104
    0x200 => final_field: u8,
}

);

该宏将用适当的填充数组填充结构体,以确保每个字段在结果中正确偏移。

此宏的预期用途是为表示具有稀疏分配或寄存器之间大间隙的MMIO设备的结构体。

限制

  • 对具有 repr(Rust) 的结构体没有影响
    • Rust可以随意重新排列结构体字段的顺序,因此无法保证字段将被正确偏移
    • 必须指定 repr(C) 或其他保持排序的repr
  • 填充的结构体无法干净地初始化
    • 填充数组也必须初始化
    • 这并不理想,因为它将宏的内部暴露给最终用户,但他们可能根本不会初始化这样的结构体
  • 填充的结构体无法整洁地打印调试信息
    • 如上所述,填充也会被打印出来
    • 可以通过显示来解决,但你可能根本不会打印一组MMIO寄存器
  • pad_struct! 的每次调用都只接受一个结构体定义
  • 仅支持命名结构体(即 struct Named { x: i32, y: i32 },而不是 struct Unnamed(i32, i32);

其中一些是可以修复的,欢迎提交PR。

许可证

许可协议如下之一

由您选择。

贡献

除非您明确声明,否则根据Apache-2.0许可证定义,您提交给工作内容的任何有意贡献,应如上双许可,无需任何额外的条款或条件。

依赖项

~1.5MB
~35K SLoC