2 个不稳定版本
0.5.1 | 2022 年 2 月 17 日 |
---|---|
0.5.0 |
|
0.1.0 | 2022 年 2 月 16 日 |
#9 in #porting
每月 75 次下载
用于 wlcs
5KB
A Rust 版本的 C 宏 container_of
。
此宏用于将结构体字段的指针转换为结构体本身的指针。注意,结构体应该是可大小的。
示例
#[repr(C)]
struct ListNode<T> {
prev: Option<Box<ListNode<T>>>,
next: Option<Box<ListNode<T>>>,
data: T
}
let list = ListNode { prev: None, next: None, data: 123 };
// Get a pointer to the `data` from `list`.
let data_ptr = &list.data as *const i32;
// Get the container of `data_ptr`, ie the `ListNode` it was made within.
// SAFETY: `data_ptr` is a valid pointer to the `data` field of a
// `ListNode<i32>`. Additionally, `ListNode<i32>` is sized.
let list_ptr = unsafe {
container_of::container_of!(data_ptr, ListNode<i32>, data)
};
// The resulting pointer is the same as if you just got it straight
// from the containing structure.
assert_eq!(list_ptr, &list as *const ListNode<i32>);
安全性
以下内容是确保正确性的必要条件
- The
$type
必须是一个可大小的结构体,它是#[repr(C)]
(或#[repr(packed)]
). - The
$ptr
必须是指向$field
字段的有效的指针。更具体地说,这意味着$ptr
必须来自一个有效的$type
结构体。
依赖项
~37KB