如何在参数中传递struct类型?我想这是不可能的,仍然想检查它是否可行。
我的要求是这样的
下面是linux内核中使用的宏list_entry
#define list_entry(ptr, type, member) \
((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
我想用函数重写它。我怎么写?
list_entry(void *ptr, ???, ???)
我们有办法做到这一点吗?
我正在尝试编写一个包装器以释放给定列表。因此,要在我的函数中使用list_entry,我的函数需要与类型和成员一起传递。有可能吗?
答案 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
)。