C - container_of宏

时间:2013-11-22 01:20:51

标签: c

为什么container_of宏看起来像这样:

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

是否存在使用它的风险,如下所示:

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

因为我们在末尾ptr转换为char *,为什么我们要做第一个宏行呢?

1 个答案:

答案 0 :(得分:4)

根据流行的解释,

const typeof( ((type *)0)->member ) *__mptr = (ptr);

行是为了额外的安全:额外的初始化确保ptr的类型与member的类型兼容。

如果不进行检查,可以将其实现为

#define new_container_of(ptr, type, member) \
   (type *)( (char *)(ptr) - offsetof(type, member) )

即。不使用像({ ... })语句表达式那样的非标准扩展名。

相关问题