【发布时间】:2017-01-25 17:58:00
【问题描述】:
struct parent
{
char a;
char b;
};
struct child
{
struct parent parent;
int c;
char d;
};
struct grandchild
{
struct child child;
long e;
};
void print_parent_val(struct parent *p)
{
printf("%d\n", p->a);
}
int main (int argc, char **argv)
{
struct grandchild g;
g.child.parent.a = 69;
print_parent_val((struct parent *)&g);
return 0;
}
程序编译(无警告)并运行良好并按预期打印69。我从未见过任何实现这种继承技术的代码,所以我很犹豫是否将其视为“OK”。
编辑:把孙子变成一个孩子怎么样?中代转换也可以吗?
void print_parent_val(struct child *c)
{
printf("%c\n", c->d);
}
int main (int argc, char **argv)
{
struct grandchild g;
g.child.parent.a = 69;
g.child.d = 'w';
print_parent_val((struct child *)&g);
return 0;
}
【问题讨论】:
-
这被称为类型双关语吗?就像在 Win32 中一样,
NMHDR和第一个成员是指向NMHDR的指针的结构?我不确定 -
您可能还想查看与您的问题相关的
man 3 offsetof。 -
您可能从未见过实现该技术的代码,但我确实编写过这样的代码。在说服自己它的行为是明确定义的之后,基于 Sourav 在他的回答中提出的基本相同的论点。我相信我并不是第一个编写此类代码的人。
-
当然,您实际上并不需要演员表。您可以取而代之的是相应成员的地址。例如,
print_parent_val(&g.child.parent)。
标签: c struct language-lawyer