根据类型区分结构

时间:2013-03-08 20:25:17

标签: c struct

我有两种不同的结构,其中有一个类型字段定义(请参见下文)。

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中提取类型。类型字段被保证是两个结构中的第一个字段。

3 个答案:

答案 0 :(得分:3)

你可以用C中的OOP设计模式做这种事情。

这里的想法是Base结构有type成员。结构AB“延伸”Base。由于Base结构是AB的第一个成员,因此可以将其转换为Base并使用它们。

这将为您提供一种安全的方式来在BaseAB之间进行投射,同时在您只需要使用{{的实例时提供编译时类型安全性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

code: Codepad

答案 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中,可能你需要更多。