gpt4 book ai didi

c - C中struct封装指针的目的

转载 作者:太空狗 更新时间:2023-10-29 16:55:44 25 4
gpt4 key购买 nike

在 Linux 内核代码中(3.1.*)我看到了这样的结构定义:

struct skb_frag_struct {
struct page *page;
/* ... */

在较新的内核版本中,这已演变为:

struct skb_frag_struct {
struct {
struct page *p;
} page;
/* ... */

在这种特殊情况下进行这种包装的目的是什么?为什么在一般情况下可能需要它?

最佳答案

使用 Git Blame View 有助于理解代码更改:

https://github.com/torvalds/linux/blame/a978a5b8d83f795e107a2ff759b28643739be70e/include/linux/skbuff.h

您可以在 commit where the change was made 的描述中看到它所说的内容:

net: add opaque struct around skb frag page

I've split this bit out of the skb frag destructor patch since it helps enforce the use of the fragment API.

所以看起来这样做只是为了捕获代码中的悬空引用,这些引用对指针进行原始访问,并强制使用更高级别的 API。它不应增加任何运行时成本。

顺便说一句:上次我自己这样做时,我有一个愚蠢的想法,即将结构的名称拆分为类似 struct { struct page *ge; 的东西。 } pa;...这样特权代码可以读作 fragstruct.pa.ge 而不是 fragstruct.page.p。但除了愚蠢之外,对外部结构使用相同名称的一个优点是有助于指导旧的用法,但有明显的错误。 尽管正如您的困惑所指出的那样,在这种情况下,在 p 成员上注释 //don't access directly, use fragment API 可能是合适的。

关于c - C中struct封装指针的目的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53229726/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com