在某些代码库中,我看到了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 实际上有用,那么两个定义的优缺点是什么?