2个版本
0.1.1 | 2023年4月17日 |
---|---|
0.1.0 | 2023年1月31日 |
#950 in 过程宏
7KB
95 行
hun_offsetof
提供类似C的宏:offset_of和container_of
与memoffset crate的区别- crate memoffset与crate self的区别
- 基于指针操作,不占用栈空间,支持超大数据结构,无栈溢出风险
- 指针操作不占用栈空间,支持超大型数据结构,避免栈溢出风险。
- 提供container_of操作
- 提供container_of操作。
基于指针的操作属于unsafe范围,如果使用声明宏方式,可能出现嵌套unsafe的编译警告,而过程宏可以消除这类警告。指针操作属于unsafe,如果使用声明宏模式,可能会产生嵌套unsafe的编译警告,而过程宏可以消除这类警告。
接口
offset_of!(type, member) -> usize;
container_of!(&obj, type, member) -> &type;
container_of_mut!(&obj, type, member) -> &mut type;
示例
extern crate hun_offsetof as hun;
#[repr(C)]
struct Bar {
key: i32,
value: i32,
}
#[repr(C)]
struct Foo {
key: i32,
value: [Bar; 2],
}
assert_eq!(hun::offset_of!(Bar, value), 4);
assert_eq!(hun::offset_of!(Foo, value[1].key), 12);
let foo = Foo {
key: 1,
value: [ Bar { key: 2, value: 2}, Bar { key: 3, value: 3 }],
};
let value = &foo.value[1].value;
let obj = unsafe { hun::container_of!(value, Foo, value[1].value) };
assert_eq!(obj as *const _, &foo as *const _);
依赖
~1.5MB
~35K SLoC