如何在参数中传递struct类型?

时间:2014-09-02 03:30:05

标签: c struct linux-kernel linked-list

如何在参数中传递struct类型?我想这是不可能的,仍然想检查它是否可行。

我的要求是这样的

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

根本不可能将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代替unsigned long)。