为什么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 *,为什么我们要做第一个宏行呢?
答案 0 :(得分:4)
根据流行的解释,
const typeof( ((type *)0)->member ) *__mptr = (ptr);
行是为了额外的安全:额外的初始化确保ptr
的类型与member
的类型兼容。
如果不进行检查,可以将其实现为
#define new_container_of(ptr, type, member) \
(type *)( (char *)(ptr) - offsetof(type, member) )
即。不使用像({ ... })
语句表达式那样的非标准扩展名。