如果我有两个结构体的前几个字段具有相同的布局,例如
struct Athis
和 struct Bthat
,我可以获取 Athis
的实例,然后使用 Bthat
来引用它以进行访问和/或修改那些初始成员/字段?
假设我有以下 2 个结构:
struct Athis {
int num;
char *str;
int *lst;
unsigned int num_lst;
// end
}
struct Bthat {
int b_num;
char *b_str;
int *b_lst;
unsigned int b_num_lst;
// more below
char *b_not_b;
bool b_hamlet;
long guildenst;
unsigned long rosencr;
}
我可以一直安全地这样做吗?
void do_stuff(struct Athis *a) {
*a.num += 2;
}
void main() {
struct Bthat b = {0};
b.b_num = 5;
b.b_str = "In hiss eeaarrrr...";
do_struff(&b);
}
换句话说,如果两个结构的初始字段的布局/顺序相同,我可以通过将任一结构的实例强制转换为两种类型/结构中的一个来修改它们吗,只要我限制自己只修改最初的“相同”字段?
我相信在 HTSlib 代码中的某个地方,Marshall、Li 和/或 Bonfield 做了类似上面的事情,这……可以说让我感到惊讶。
我最终在自己的代码中做了一些事情,其中我有两个非常相似的结构,并且只需要访问这些结构的初始字段——我想到了他们做了什么。
为了安全地执行此操作,
struct Athis
的实例应该是struct Bthat
的第一个成员:
struct Athis {
int num;
char *str;
int *lst;
unsigned int num_lst;
// end
};
struct Bthat {
struct Athis A;
// more below
char *b_not_b;
bool b_hamlet;
long guildenst;
unsigned long rosencr;
};
现在您可以:
void do_stuff(struct Athis *a) {
a->num += 2;
}
void main() {
struct Bthat b = {0};
b.A.num = 5;
b.A.str = "In hiss eeaarrrr...";
do_stuff(&b.A);
}