扩展结构

2023-12-14

typedef struct A 
{
  int x;
}A;

typedef struct B 
{
  A a;
  int d;
}B;

void fn()
{
  B *b;
  ((A*)b)->x = 10;
}

我在 SO 中阅读了上面的代码片段。((A*)b)->x不是好的编程风格。b->a.x是良好的编程风格。因为任何人都会在语句“A a;”之前添加一些内容在结构 b 中,它将不起作用。我不明白为什么?我也尝试过。请问有什么建议吗?


该技巧用于模拟 C 中的继承。它可以将地址 A 或 B 传递给需要指向 A 的指针的函数。

这是可行的,因为 C 保证结构体的第一个成员之前没有填充。因此,如果 A 是 B 的第一个成员,则 B 开头的内存布局始终与 A 相同。

int doStuff(A * a) {
    return a->x + 1;
}

...

B b;
doStuff((A*)&b); // Will work because b and b.a have the same start address

如果您要更改 B 声明:

typedef struct B 
{
    int d;
    A a;
}B;

这将不再有效(A*)&b将返回地址b.d, not b.a.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

扩展结构 的相关文章

随机推荐