在C中将指针包装在struct中的目的

时间:2018-11-09 16:33:12

标签: c pointers struct linux-kernel

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

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

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

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

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

1 个答案:

答案 0 :(得分:7)

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

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

您可以在commit where the change was made的说明中看到其内容:

  

网络:在skb片段页面周围添加不​​透明结构

     

我已将此部分从skb frag destructor补丁中分离出来,因为它有助于强制执行   片段API的使用。

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

顺便说一句:上次我自己做此操作时,我有一个愚蠢的想法,那就是将结构的名称拆分为类似struct { struct page *ge; } pa;的形式...这样,特权代码可以读取为 fragstruct.pa.ge 而不是 fragstruct.page.p 。但是除了这很愚蠢之外,对外部结构使用相同名称的一个优点是可以帮助指导旧用法并避免明显的错误。  尽管您感到困惑,但在这种情况下,对// don't access directly, use fragment API成员的评论p可能是适当的。