无效*强制转换为泛型函数

时间:2020-04-18 17:41:55

标签: c pointers struct casting void

我正在尝试构建一个通用函数,如下所示

struct x {
    int l;
    char p;
};

struct y {
    int l;
    char p;
};

void test (void *t, int type)
{
   if (type)
     (struct y*)t;
   else
     (struct x*)t;

   t->l = 6;
   t->p = 'k';
}

类似这样的变量t必须与强制转换x *或y *具有相同的名称。您是否有可能这样做或有其他建议? 谢谢!

1 个答案:

答案 0 :(得分:0)

此:

(struct y*)t;

不会永久更改t的类型。它使用t的值,将该值的类型从void *转换为struct y *,然后丢弃该值,因为它什么也没做。

转换指针值之后,可以随后取消对结果表达式的引用并分配给适当的成员。

if (type)
  ((struct y*)t)->l = 1;
else
  ((struct x*)t)->l = 1;

或者,您可以将t的值分配给适当类型的变量并继续使用该变量:

if (type) {
    struct y *y1 = t;
    y1->l = 1;
    // do more with y1
} else {
    struct x *x1 = t;
    x1->l = 1;
    // do more with x1
}

如果要在具有某些公共成员的两个结构上工作,则需要使用公共成员创建一个单独的结构,并将其包含在两个结构的每一个中。

struct z {
    int l;
    char p;
};

struct x {
    struct z z;
    int i;
};

struct y {
    struct z z;
    double j;
};

void test(struct z *t)
{
   t->l = 6;
   t->p = 'k';
}

int main()
{
    struct x x1;
    struct y y1;
    test((struct z*)&x1);
    test((struct z*)&y1);
}

之所以允许进行上述强制转换,是因为可以将指向结构的指针安全地转换为指向其第一个成员的指针。