C中struct封装指针的目的

The purpose of wrapping a pointer in struct in C

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

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

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

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

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

使用 Git 责备视图有助于理解代码更改:

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 在这种情况下可能是合适的。