c-如何在参数中传递结构类型



如何在参数中传递结构类型?我想这是不可能的,还是想看看是否可行。

我的要求是类似于这个

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

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

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

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

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

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

根本不可能将具有相同行为和签名的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)。

相关内容

  • 没有找到相关文章

最新更新