container_of宏的定义

时间:2012-11-19 08:49:17

标签: macros linux-kernel c-preprocessor

而不是将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) );})

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

1 个答案:

答案 0 :(得分:7)

它增加了某种程度的类型安全性。使用你的第二个版本,我可以为ptr传递任何内容,它可以正常编译。使用内核的版本,如果传入的ptr指针与type.member的类型不匹配,则至少会收到警告。