20 个版本
使用旧的 Rust 2015
0.9.1 | 2024年3月26日 |
---|---|
0.9.0 | 2023年5月19日 |
0.8.0 | 2022年12月15日 |
0.7.1 | 2022年10月17日 |
0.1.0 | 2017年10月17日 |
#21 in Rust 模式
9,350,167 月下载量
用于 7,461 个crate (200 直接)
36KB
583 行
memoffset
类似于 C 的 offset_of
功能,用于 Rust 结构体。
引入以下宏
offset_of!
用于获取结构体成员的偏移量。offset_of_tuple!
用于获取元组成员的偏移量。 (需要 Rust 1.20+)offset_of_union!
用于获取联合体成员的偏移量。span_of!
用于获取字段或字段的范围。
memoffset
在 no_std
环境下运行。
如果你使用的 rustc 版本大于或等于 1.77,这个crate的 offset_of!()
宏将直接转发到 core::mem::offset_of!()
。
用法
将以下依赖项添加到你的 Cargo.toml
[dependencies]
memoffset = "0.9"
这些版本与 rustc 版本大于或等于 1.19 的情况下可以正常编译。
示例
use memoffset::{offset_of, span_of};
#[repr(C, packed)]
struct Foo {
a: u32,
b: u32,
c: [u8; 5],
d: u32,
}
fn main() {
assert_eq!(offset_of!(Foo, b), 4);
assert_eq!(offset_of!(Foo, d), 4+4+5);
assert_eq!(span_of!(Foo, a), 0..4);
assert_eq!(span_of!(Foo, a .. c), 0..8);
assert_eq!(span_of!(Foo, a ..= c), 0..13);
assert_eq!(span_of!(Foo, ..= d), 0..17);
assert_eq!(span_of!(Foo, b ..), 4..17);
}
在常量中的使用
memoffset
支持 rust>=1.65 的编译时 offset_of!
。
在低于1.77的版本中,这是一个不完整的实现,存在一个注意事项:由于依赖于#![feature(const_refs_to_cell)]
,您无法在const上下文中获取Cell
字段的偏移量。