#offset #offset-of #mem #constant

无 std memoffset

Rust 结构体的 offset_of 功能

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 模式

Download history 2260535/week @ 2024-04-22 2133712/week @ 2024-04-29 2180786/week @ 2024-05-06 2204086/week @ 2024-05-13 2232107/week @ 2024-05-20 2068713/week @ 2024-05-27 2126795/week @ 2024-06-03 2249974/week @ 2024-06-10 2075802/week @ 2024-06-17 2193197/week @ 2024-06-24 1925007/week @ 2024-07-01 2214804/week @ 2024-07-08 2246181/week @ 2024-07-15 2294927/week @ 2024-07-22 2283088/week @ 2024-07-29 2404929/week @ 2024-08-05

9,350,167 月下载量
用于 7,461 个crate (200 直接)

MIT 许可证

36KB
583

memoffset

类似于 C 的 offset_of 功能,用于 Rust 结构体。

引入以下宏

  • offset_of! 用于获取结构体成员的偏移量。
  • offset_of_tuple! 用于获取元组成员的偏移量。 (需要 Rust 1.20+)
  • offset_of_union! 用于获取联合体成员的偏移量。
  • span_of! 用于获取字段或字段的范围。

memoffsetno_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字段的偏移量。

无运行时依赖