2014-09-02 54 views
1

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

我的要求是这样的

下面是在Linux内核中使用宏list_entry

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

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

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

有没有办法可以做到这一点?

我想写一个包装来释放给定的列表。所以要在我的函数中使用list_entry,我的函数需要通过type和成员来传递。可能吗?

回答

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)的自由。

+0

谢谢你..好主意.. !!! – 2014-09-02 04:06:22

相关问题