假设T1
和T2
是两种类型,并给出以下结构:
struct s
{
T1 x;
T2 y;
}
此外,假设我们有一个类型为 的对象struct s
:
struct s a;
由此,我们可以计算出指向对象第二个结构成员的指针:
T2 *q = &s.y;
我正在寻找的是一种可移植的方法,可以从q
指向objectp
的类型指针struct s *
进行计算。p
a
给定T2 *q = &s.y;
, 然后char *x = (char *) q - offsetof(struct s, y);
定义一个x
指向 的第一个字节的s
. offsetof
宏定义在<stddef.h>
.
然后可能会期望struct s *p = (struct s *) x;
定义p
指向 的a s
,这取决于人们希望如何迂腐地解释 C 标准。(将指针转换为指向char
它的第一个字节的结构的指针并未由标准明确定义。我们可以将标准的规范中的指针“转换回”,在 C 2018 6.3.2.3 7 中,它的原始类型来涵盖这种情况。)我希望它可以在所有正常的 C 实现中工作。
您正在寻找container_of()
;来自维基百科
#define container_of(ptr, type, member) ((type *)((char *)(1 ? (ptr) : &((type *)0)->member) - offsetof(type, member)))
或更简单,但不太安全
#define container_of(ptr, type, member) ((type *)((char *)(ptr) - offsetof(type, member)))
在您的情况下,您可以像这样应用它
struct *s = container_of(q, struct s, y);
T2 *py = &z.y
T1 *px = (T1 *)((char *)py - ((char *)&z.y - (char *)&z.x));