Код ядра Linux (по лицензии GPLv2) включает удобный макрос container_of()
:
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
Используется так:
static inline struct ext3_inode_info *EXT3_I(struct inode *inode)
{
return container_of(inode, struct ext3_inode_info, vfs_inode);
}
@ Ответ Ричарда превосходен; Основное отличие состоит в том, что этот код параметризован для принятия любого struct
и любого члена, и в результате, соответственно, более сложный.