5

而不是将 container_of 定义为:

#define container_of(ptr, type, member) ({ \
            const typeof( ((type *)0)->member ) *__mptr = (ptr);
            (type *)( (char *)__mptr - offsetof(type,member) );})

为什么这不能简单地工作:

#define container_of(ptr, type, member) ({ \
                    (type *)( (char *)(ptr) - offsetof(type,member) );})

定义中第一行的用途是什么?

4

1 回答 1

8

它增加了一定程度的类型安全性。使用您的第二个版本,我可以为 ptr 传递任何内容,并且可以正常编译。在内核版本中,如果您传入一个ptrtype.member.

于 2012-11-19T18:03:59.223 回答