1 个稳定版本
1.0.0 | 2023年2月24日 |
---|
#432 在 无标准库
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版本(《LICENSE-APACHE》或https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证(《LICENSE-MIT》或http://opensource.org/licenses/MIT)
由您选择。
贡献
除非您明确声明,否则根据Apache-2.0许可证定义,您提交给工作内容的任何有意贡献,应如上双许可,无需任何额外的条款或条件。
依赖项
~1.5MB
~35K SLoC