#pointers #macro #container #porting #struct #struct-fields #field

container_of

将 C 的 container_of 宏移植到 Rust

2 个不稳定版本

0.5.1 2022 年 2 月 17 日
0.5.0 2022 年 2 月 17 日
0.1.0 2022 年 2 月 16 日

#9 in #porting

Download history 14/week @ 2024-04-07 25/week @ 2024-04-14 22/week @ 2024-04-21 60/week @ 2024-04-28 18/week @ 2024-05-05 14/week @ 2024-05-12 14/week @ 2024-05-19 10/week @ 2024-05-26 19/week @ 2024-06-02 19/week @ 2024-06-09 20/week @ 2024-06-16 15/week @ 2024-06-23 16/week @ 2024-06-30 15/week @ 2024-07-07 18/week @ 2024-07-14 25/week @ 2024-07-21

每月 75 次下载
用于 wlcs

MIT 许可证

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