如何在参数中传递结构类型?我想这是不可能的,还是想看看是否可行。
我的要求是类似于这个
下面是在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
)。