[][src]Macro memoffset::offset_of

macro_rules! offset_of {
    ($parent:ty, $($field:tt)+) => { ... };
}

Calculates the offset of the specified field from the start of the struct. This macro supports arbitrary amount of subscripts and recursive member-accesses.

Note: This macro may not make much sense when used on structs that are not #[repr(C, packed)]

Examples - Simple

#[macro_use]
extern crate memoffset;

#[repr(C, packed)]
struct Foo {
    a: u32,
    b: u64,
    c: [u8; 5]
}

fn main() {
    assert_eq!(offset_of!(Foo, a), 0);
    assert_eq!(offset_of!(Foo, b), 4);
    assert_eq!(offset_of!(Foo, c[2]), 14);
}

Examples - Advanced

#[macro_use]
extern crate memoffset;

#[repr(C, packed)]
struct UnnecessarilyComplicatedStruct {
    member: [UnnecessarilyComplexStruct; 12]
}

#[repr(C, packed)]
struct UnnecessarilyComplexStruct {
    a: u32,
    b: u64,
    c: [u8; 5]
}


fn main() {
    const OFFSET: usize = offset_of!(UnnecessarilyComplicatedStruct, member[3].c[3]);
    assert_eq!(OFFSET, 66);
}