在查看 Linux 内核对双向循环列表的实现时,我发现了以下宏:
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
它的工作方式是它返回指向结构的指针,该结构仅给出其成员之一的地址:
struct blabla
{
int value;
struct list_head *list;
}
因此,仅给出指向列表的指针,您就可以获得指向 blabla 的指针(并获得“值”)。对于我的问题,我将如何使其尽可能便携(符合 C89/C99 的最佳情况?)。由于使用了 typeof(),这只是 gcc。
这是我到目前为止所得到的:
#define container_of(ptr, type, member) ( \
(type *) (char *)(ptr)-offsetof(type,member)\
)
这个片段是否符合 ISO 标准(因此应该能够在任何符合标准的编译器上编译)?