【问题标题】:How to pass struct type in arguments?如何在参数中传递结构类型?
【发布时间】:2014-09-02 03:30:05
【问题描述】:

如何在参数中传递结构类型?估计不行,还是想看看是否可行。

我的要求是这样的

下面是linux内核中使用的宏list_entry

#define list_entry(ptr, type, member) \
    ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))

我想用函数重写它。怎么写?

list_entry(void *ptr, ???, ???)

我们有办法做到这一点吗?

我正在尝试编写一个包装器来释放给定的列表。因此,要在我的函数中使用 list_entry,我的函数需要与类型和成员一起传递。有可能吗?

【问题讨论】:

    标签: c struct linux-kernel linked-list


    【解决方案1】:

    基本上不可能将具有相同行为和签名的list_entry 编写为函数。这是因为它的参数包括一个类型和一个成员名,这两者都不是 C 中的值。

    另一方面,您可以在某种程度上将宏的“代码”内容抽象为一个函数:

    #define list_entry(ptr, type, member) \
        ((type *)f_list_entry(ptr, offsetof(type, member)))
    
    static void *f_list_entry(void *ptr, size_t offset)
    {
        return (char *)(ptr)-offset;
    }
    

    但正如您所见,唯一实际的“代码”是单减法。

    由于我使用了标准的 offsetof 宏而不是内核的未定义行为调用,因此我还冒昧地修复了类型正确性(size_t 而不是 @ 987654325@)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-21
      • 2016-11-07
      • 2018-08-02
      • 2010-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多