void * 转换为通用函数

void * cast for generic function

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

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*。您知道这是否可行或有其他建议吗? 谢谢!

这个:

(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);
}

允许上述转换,因为指向结构的指针可以安全地转换为指向其第一个成员的指针。