我有两种不同的结构,其中有一个类型字段定义(请参见下文)。
struct A {
int type;
char type_a[8];
char random[8];
};
struct B {
int type;
char type_b[16];
char random[16];
};
现在我想根据类型So区分这两个结构,例如
if (type == A)
struct A *a = (struct A *)buff;
if (type == B)
struct B *b = (struct B *)buff;
我不知道手中有什么类型的结构传递给我。那么如何从buff中提取类型。类型字段被保证是两个结构中的第一个字段。
答案 0 :(得分:3)
你可以用C中的OOP设计模式做这种事情。
这里的想法是Base
结构有type
成员。结构A
和B
“延伸”Base
。由于Base
结构是A
和B
的第一个成员,因此可以将其转换为Base
并使用它们。
这将为您提供一种安全的方式来在Base
和A
或B
之间进行投射,同时在您只需要使用{{的实例时提供编译时类型安全性1}}。
Base
答案 1 :(得分:1)
C具有union功能,可用于此类数据结构。 union在外观上与struct类似,但union中的每个成员都占用相同的内存位置。然后在下面的示例中使用另一个字段type
,以便您可以知道如何解释结构。
使用它可以在不进行任何转换的情况下解决您的问题,并保持编译时类型的安全性。
这是一个完整的例子:
#include <stdio.h>
#include <string.h>
#define TYPE_A 1
#define TYPE_B 2
struct A
{
char member1[8];
char member2[8];
};
struct B
{
char member1[16];
char member2[16];
};
struct base
{
int type;
union
{
struct A a;
struct B b;
} data;
};
char *get_member2(struct base *buff)
{
if (buff->type == TYPE_A)
return buff->data.a.member2;
if (buff->type == TYPE_B)
return buff->data.b.member2;
return NULL;
}
int main(void)
{
struct base b1;
struct base b2;
/* Set up test structs. */
b1.type = TYPE_A;
strcpy(b1.data.a.member2, "Hello");
b2.type = TYPE_B;
strcpy(b2.data.b.member2, "World");
/* Print member2 from each struct. */
printf("%s\n", get_member2(&b1));
printf("%s\n", get_member2(&b2));
return 0;
}
输出:
Hello
World
答案 2 :(得分:0)
假设你不想/不能改变A和B:
#define TYPE_A 0
#define TYPE_B 1
...
struct *B create_B()
{ struct *B= malloc(sizeof B);
B->type=TYPE_B;
return B;
}
...
void *buff=create_B();
...
struct A a;
a.type=TYPE_A;
void *buff=&a;
...
struct A *a=NULL;
struct B *b=NULL;
int type = *((int *)buff);
if (type == TYPE_A)
a = (struct A *)buff;
else if (type == TYPE_B)
b = (struct B *)buff;
你的代码的问题是a和b的范围只在if中,可能你需要更多。