container_of的两个定义的优缺点(ptr,type,member)

时间:2017-07-24 06:04:52

标签: c macros

在某些代码库中,我看到了container_of()宏的定义,如下所示:

#ifndef container_of
#ifdef __GNUC__
#define container_of(ptr, type, member) \
    ({ \
        const typeof(((type *)0)->member) *__mptr = (ptr); \
        (type *)( (char *)__mptr - offsetof(type, member) ); \
    })     /* definition 1 */
#else
#define container_of(ptr, type, member) \
    ((type *)((char *)(ptr) - offsetof(type, member)))  /* definition 2 */
#endif
#endif // container_of

对我而言,定义2 似乎足够合理,而在定义1 中,作者使用GCC的typeof关键字来获取ptr的类型,然后将其强制转换为char *,使typeof语句无用。

定义1 背后的理由是什么?如果定义1 实际上有用,那么两个定义的优缺点是什么?

0 个答案:

没有答案